Laden...

[gelöst] BinaryWriter und MemoryStream: unerwartete Ergebnisse

Erstellt von Lucas de Vil vor 12 Jahren Letzter Beitrag vor 12 Jahren 950 Views
L
Lucas de Vil Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren
[gelöst] BinaryWriter und MemoryStream: unerwartete Ergebnisse

Moin,

folgender Code:

System.IO.MemoryStream binaryStream = new System.IO.MemoryStream();
System.IO.BinaryWriter writeALLTheThings = new System.IO.BinaryWriter(binaryStream);
byte ff = 0xFF;
byte dreinull = 0x30;
byte fe = 0xFE;
byte[] nullen = new byte[16] {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};

writeALLTheThings.Write(ff);
writeALLTheThings.Write(dreinull);
writeALLTheThings.Write((Int32)(message.Length));
writeALLTheThings.Write((UInt32)3);
writeALLTheThings.Write(nullen, 0, 16);
writeALLTheThings.Write(nullen, 0, 16);
writeALLTheThings.Write(fe);
writeALLTheThings.Close();

Debug.WriteLine("Data:\n"+BitConverter.ToString(binaryStream.GetBuffer(), 0, binaryStream.GetBuffer().Length));

sollte meinem Verständnis nach folgende Ausgabe liefern:

FF-30-00-00-00-01-00-00-00-03-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-FE

Tatsächlich bekomme ich aber

FF-30-01-00-00-00-03-00-00-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-FE-00-00-00- und weitere 210 Nullbytes

Daran stören mich eigentlich genau zwei Dinge:

a) warum wird an Position 3 aus meinem Integer, den ich frecherweise auch noch auf nen 32 Bit Int caste, einfach ein Byte gemacht?
Sei message.Length=256, dann heißt das Byte einfach '00', ein vorheriges Umbauen und Nutzen von UInt32 ändert auch nix, obwohl im Folgenden an Position 4 an ordentlicher Integer mit den erwarteten 4 Byte erstellt wird.

b) und wo kommt dieser Rattenschwanz an 00-Blöcken her?

Irgendwie helfen mir die zur Verfügung stehenden Dokumente in diesem Fall leider nicht weiter...

Hat jemand nen Tipp, wie ich besagte Problemchen beseitigt bekomme?

Es gibt 10 Arten von Menschen. Die einen verstehen das binäre Zahlensystem, die anderen nicht.

P
992 Beiträge seit 2007
vor 12 Jahren

zu b) Du must binaryStream.ToArray() verwenden und nicht binaryStream.GetBuffer(), da der Puffer größer ist als die tatsächlichen Daten

L
Lucas de Vil Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren

Genial, danke! 🙂
Ah, unter den Hinweisen zum Stream steht's ja auch. Schade, dass die IDE sich darüber ausschweigt.
Umso besser, dass einem geholfen wird. 👍

Es gibt 10 Arten von Menschen. Die einen verstehen das binäre Zahlensystem, die anderen nicht.

656 Beiträge seit 2008
vor 12 Jahren

zu a) sieht das ganze nach einer anderen Endianness aus, als du erwartest. Unter x86 ist Little-Endian der Standard, sprich das least-significant bit (bei deinem Wert "3" ist das 3; die "kleineren" 8 Bit) steht an erster Stelle (darum kommt 03 00 00 00 raus, und nicht 00 00 00 03 wie du erwartest).

L
Lucas de Vil Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren

So gesehen wird mir mein Verständnisfehler klar. Ich habe mich so auf Position 3 fixiert, dass ich die Folgenden einfach nicht beachtet habe.

So wurde aus 'FE 30 00 01 00 00 03...' eben anstelle der '256' eine '0' und aus dem UInt32 '3' ein Int32 '+3'...
+kopf->tisch+

Danke, dass du mich vom Schlauch geschubst hast, auf dem ich stand. 😃

Es gibt 10 Arten von Menschen. Die einen verstehen das binäre Zahlensystem, die anderen nicht.