Ich versuche, eine binäre Datei mit der BinaryReader-Klasse zu lesen, und ich muss sie als Blöcke von UInt32 einlesen, und dann ein bisschen verschieben usw. nachher.
Aber aus irgendeinem Grund wird die Bit-Reihenfolge umgekehrt, wenn ich die ReadUInt32-Methode verwende.
Wenn ich zum Beispiel eine Datei habe, in der die ersten vier Bytes in hex, 0x12345678
, aussehen, dann enden sie so, nachdem sie von ReadUInt32 gelesen wurden: 0x78563412
.
Wenn ich die ReadBytes (4) -Methode verwende, bekomme ich das erwartete Array:
%Vor%Warum ist das? Ist es nur die Art und Weise, wie .net die gespeicherten Daten darstellt? Ist es das gleiche über die verschiedenen Plattformen (ich 64-Bit-Windows 7, .net 3.5 SP1 laufen)?
Dies scheint ein endianness Problem zu sein. Die Dokumente sagen, ReadUint32 liest Little-Endian ein, also das erste Byte das niedrigstwertige also geht es zum untersten Speicherplatz. Dein Schreiber muss Big-Endian sein?
BinaryWriter.Write(UInt32)
sagt, es schreibt auch little-endian. Ist Ihre binäre Datenquelle nicht BinaryWriter?
Im Wesentlichen müssen Sie Folgendes beheben:
%Vor%Dies verschiebt das niedrigstwertige Byte um 24 Bits, das zweite LSB um 8 Bits, das dritte LSB um 8 Bits und das vierte LSB (das MSB) um 24 Bits. Dies wird in mehreren Bibliotheken behandelt.
Vielleicht wäre die Verwendung von BitConverter
etwas klarer:
Dies ist ein Problem der Plattform Endianess . Wenn Sie Daten aus einem Stream lesen, müssen Sie sie entsprechend der Endianess lesen, in der sie geschrieben wurde. Wenn Sie die Daten in .Net erstellt haben, liest .Net sie korrekt.
Jon Skeet hat einen BitConverter mit konfigurierbarer Endian-Ness geschrieben. Sie könnten es nützlich finden.
Lesen Sie Generic BinaryReader und BinaryWriter Extensions , eine großartige Möglichkeit, generisches Casting auf nicht-verwaltete Weise zu handhaben.
Für VB.NET (nur sicherer Code, kann auch in C # erreicht werden) verwenden Sie Folgendes:
Importiert System.IO Importiert System.Runtime.CompilerServices Imports System.Runtime.InteropServices
%Vor% Sie können jetzt dieselbe Funktionalität für BitConverter
für BinaryWriter
usw.
Tags und Links .net 64bit 32-bit bit-manipulation endianness