Warum kehrt BinaryReader.ReadUInt32 () das Bitmuster um?

7

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)?

    
Egil Hansen 22.05.2009, 18:25
quelle

6 Antworten

8

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:

%Vor%     
Colin Burnett 22.05.2009, 18:31
quelle
8

Ja, das hat damit zu tun, wie Ihre Computer-Hardware die Arbeitsspeicher speichert. Es kann auf verschiedenen Plattformen unterschiedlich sein, obwohl die meisten Desktop-Computer identisch sein sollten.

Dies wird Endianness genannt - siehe Wikipedia hier:

Ссылка

    
Clyde 22.05.2009 18:30
quelle
2

Sieh dir die MiscUtil-Bibliothek von Jon Skeet für die Endian * -Klassen an, wie EndianBinaryReader und EndianBitConverter.

Ссылка

    
bsneeze 22.05.2009 18:33
quelle
1

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.

    
Remus Rusanu 22.05.2009 18:33
quelle
1

Jon Skeet hat einen BitConverter mit konfigurierbarer Endian-Ness geschrieben. Sie könnten es nützlich finden.

Ссылка

    
Michael Petrotta 22.05.2009 18:33
quelle
0

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.

    
Shimmy 18.07.2010 01:04
quelle