Laden...

Writer Klasse ohne Endianness

Erstellt von Shinzo vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.258 Views
S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren
Writer Klasse ohne Endianness

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

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Shinzo,

was spricht gegen die BitConverter-Klasse?

zero_x

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

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?

309 Beiträge seit 2008
vor 13 Jahren

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));}}

1.361 Beiträge seit 2007
vor 13 Jahren

Byte-weise einlesen, Byte-weise abspeichern!

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

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.

Gelöschter Account
vor 13 Jahren

Wie genau kommunizierst du mit der Hardware?

U
1.688 Beiträge seit 2007
vor 13 Jahren

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.

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

@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.

U
1.688 Beiträge seit 2007
vor 13 Jahren

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.

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

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.

1.130 Beiträge seit 2007
vor 13 Jahren

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;
    }
}

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

Die Funktion, die du da gepostet hast, ist in C# ja aufgrund von Array.Reverse() unnötig. 😉

1.130 Beiträge seit 2007
vor 13 Jahren

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.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!