Hallo,
ich lese von einer Hardware Daten aus, die die Hardware im Big Endian System gespeichert hat. Nun möchte ich diese Daten auch in genau dieser Reihenfolge abspeichern.
Ich habe eine Methode um den Speicher der Hardware auszulesen. Diese liefert mir ein uint zurück. In diesem uint stimmt die Reihenfolge der Bits noch.
Aber sobald ich das ganze per BinaryWriter speichern möchte, dreht er es mir um. Gibt es in C# keine Klasse, die Daten speichern kann, ohne alles 32-bit-weise umzudrehen, nur weil mein aktuelles System ein Little Endian System ist?
C++ stellt sich mit ifstream bzw. ofstream da auch nicht so an.
Danke!
Gruß
Shinzo
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Dagegen spricht, dass sie die Bytes ebenfalls umdreht. 😉
Aktuell benutze ich den BitConverter und nutze anschließend Array.Reverse() um das wieder richtig zu drehen.
Aber es wird doch wohl möglich sein, die Daten direkt in der alten Reihenfolge wegzuspeichern?
Mir fällt keine Klasse sein die das könnte. Es scheint auch keine zu geben, da in den MSDN Beispielen auch mit Array.Revers() gearbeitet wird.
Siehe:
How to: Convert a byte Array to an int (C# Programming Guide)
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
Mit welcher Klasse soll ich das machen?
Ich habe nunmal ein uint, das geschrieben werden muss. Und wenn ich das mit dem BitConverter in Bytes zerlege, dann dreht der mir das doch schon direkt.
Ich habe eine Methode um den Speicher der Hardware auszulesen. Diese liefert mir ein uint zurück.
Was ist das für eine Methode?
In diesem uint stimmt die Reihenfolge der Bits noch.
Woher weißt Du das?
Müsste es denn nicht so sein, dass das uint "falsch" ist (also nicht dem uint der Hardware entspricht, weil es eben anders interpretiert wird) und beim Speichern wieder "richtig" wird?
Ansonsten gilt, was Zommi gesagt hat: Byte[] lesen und schreiben. Falls das nicht gehen sollte, dann BitConverter nehmen und "manuell" sortieren.
Gibt es in C# keine Klasse, die Daten speichern kann, ohne alles 32-bit-weise umzudrehen, nur weil mein aktuelles System ein Little Endian System ist?
C++ stellt sich mit ifstream bzw. ofstream da auch nicht so an.
Du musst schon etwas mehr über die API sagen - wenn Du in C++ einen FileStream nehmen kannst, kannst Du das in C# auch.
@JAck30lena: Mit der Hardware kommuniziere ich via USB.
@ujr: Die Methode kommt vom Treiber der Hardware. Dass die Reihenfolge stimmt (also Big Endian), sehe ich doch im Debugger. Wenn ich durch das Array durchgehe, dann sehe ich doch, wo welches Byte steht. Die Alternative ("ansonsten") habe ich aktuell ja auch implementiert. Per BitConverter in einen Byte-Array umwandeln und diesen dann wieder mit Array.Reverse umdrehen, weil BitConverter die Reihenfolge vertauscht hat. Mir wäre außerdem nicht bekannt, dass man in C# die Klasse ifstream benutzen kann. Ich benutze ASCI C++ und nicht C++/CLI.
Dass die Reihenfolge stimmt (also Big Endian), sehe ich doch im Debugger. Wenn ich durch das Array durchgehe, dann sehe ich doch, wo welches Byte steht.
Welcher Debugger, welches Array? Bisher schreibst Du doch von uint?!
Mir wäre außerdem nicht bekannt, dass man in C# die Klasse ifstream benutzen kann.
Wie oben nachzulesen ist, ging es um einen FileStream.
Leider schweigst Du Dich trotz Nachfrage über die API und Code-Beispiele aus.
Welcher Debugger, welches Array? Bisher schreibst Du doch von uint?
Ich schaue mir mit einem hex-Editor die Daten vorher an und vergleiche Sie danach mit dem Array, dass ich vom BitConverter bekomme. Da sehe ich dann, dass sie verdreht wurden. Außerdem sehe ich es, wenn ich das uint gehe und dort vorher 0x01234567 drinsteht und nachher im Array 0x67 0x45 0x23 0x01. 😉
Wie oben nachzulesen ist, ging es um einen FileStream.
Leider schweigst Du Dich trotz Nachfrage über die API und Code-Beispiele aus.
Wie ich schon geschrieben habe, kenne ich keine Klasse in C#, die Daten einfach als Stream in eine Datei schreibt, außer der Streamwriter, der daraus aber einen String macht. Ich möchte ja aber die Binärdaten behalten.
Codebeispiele wirst du von mir auch nie sehen, da ich für ein Unternehmen arbeite und daher natürlich keinerlei Code vom Projekt nach außen getragen werden darf. Wie oben geschrieben greife ich über einen Treiber (.dll) auf die Hardware zu. Dieser Treiber bietet verschiedene Methoden an, wie das auslesen vom RAM der Hardware. Und diese Methode gibt mir eben einen Array von uints zurück und zwar im Big Endian Format.
mein
Binary-Writer/-Reader 2.0
kann die endianess umbrehen. (oder wahlweise uch nicht) Allerding schreibt der die länge des arrays vor die eigendlichen daten, du musst also in einer schleife speichern.
ansonsten geht es mit unsafe relativ einfach:
uint[] daten=...
fixed(uint* pUints=&daten)
{
byte* pbyte=pUints;
for(int i=0;i<daten.Length;i++)
{
byte h;
h=pbyte[0];
pbyte[0]=pbyte[3];
pbyte[3]=h;
h=pbyte[1];
pbyte[1]=pbyte[2];
pbyte[2]=h;
pbyte+=4;
}
}
Die Funktion, die du da gepostet hast, ist in C# ja aufgrund von Array.Reverse() unnötig. 😉
C# ja aufgrund von Array.Reverse() unnötig
naja es ist aber zum einen hundertmal schneller als array. reverse und für jedes element jeweils ein array erstellen muss nicht sein, finde ich.
Buffer.BlockCopy wäre ein besserer kompromiss.
aber es kommt halt darauf an, was man will.