Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[gelöst] BinaryWriter und MemoryStream: unerwartete Ergebnisse
Lucas de Vil
myCSharp.de - Member



Dabei seit:
Beiträge: 11
Herkunft: Hamburg

Themenstarter:

[gelöst] BinaryWriter und MemoryStream: unerwartete Ergebnisse

beantworten | zitieren | melden

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:
Zitat
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
Zitat
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?
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Lucas de Vil am .
Es gibt 10 Arten von Menschen. Die einen verstehen das binäre Zahlensystem, die anderen nicht.
private Nachricht | Beiträge des Benutzers
punkdevil
myCSharp.de - Member



Dabei seit:
Beiträge: 992

beantworten | zitieren | melden

zu b) Du must binaryStream.ToArray() verwenden und nicht binaryStream.GetBuffer(), da der Puffer größer ist als die tatsächlichen Daten
private Nachricht | Beiträge des Benutzers
Lucas de Vil
myCSharp.de - Member



Dabei seit:
Beiträge: 11
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Lucas de Vil am .
Es gibt 10 Arten von Menschen. Die einen verstehen das binäre Zahlensystem, die anderen nicht.
private Nachricht | Beiträge des Benutzers
BhaaL
myCSharp.de - Member

Avatar #erP6yAFiewXrJTqrvg6R.jpg


Dabei seit:
Beiträge: 654

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
Lucas de Vil
myCSharp.de - Member



Dabei seit:
Beiträge: 11
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers