2016-08-09 39 views
2

Ich versuche eine JPEG-Datei zu parsen. This page sagt, dass das Format ist folgende:Was ist mit dieser 2-Byte-zu-Int-Konvertierung falsch?

0xFF + Marker Nummer (1 Byte) + Datengröße (2 Byte) + Data (n Bytes)

Also, wenn ich ein 0xFF begegnen, ich lese die Daten wie folgt (s ist die JPEG-Datei-Stream):

int marker, size; 
byte[] data; 
//marker number (1 byte) 
marker = s.ReadByte(); 
//size (2 bytes) 
byte[] b = new byte[2]; 
s.Read(b, 0, 2); 
size = BitConverter.ToInt16(b, 0); 

Problem ist, size ‚s-Wert danach ist -7.937 (die die nächsten Zeilen wird eine Ausnahme zu erhöhen, weil ich versuche, eine zu ermöglichen -7937-langes Byte []). b[0] == 255 und b[1] == 224.

Ich vermute, ich benutze BitConverter.ToInt16 nicht richtig, aber ich kann nicht finden, was ich falsch gemacht habe.

Die BitConverter doc page sagt, dass „Die Reihenfolge der Bytes im Array die endianness des Computersystems Architektur widerspiegeln muss“, aber wenn ich dies tun:

byte a = b[0]; b[0] = b[1]; b[1] = a; 
size = BitConverter.ToInt16(b, 0); 

... Ich size == -32 bekommen, was nicht wirklich ist besser.

Was ist das Problem?

+7

Vielleicht ist es ein unsigned kurz, so sollten Sie verwenden 'BitConverter.ToUInt16()' –

+1

Die Bits sind offensichtlich '0xFF70' oder' 0x70FF', beide haben die meisten Bit gesetzt, so Matthew scheint richtig, es sollte ein sein unsigniertes Wort. Verwenden Sie 'uint size = BitConverter.ToUInt16()'. –

+1

siehe http://stackoverflow.com/a/8227753/6007877 Ich denke, Sie haben über die 0xE1 vergessen – gismo

Antwort

1

Die fraglichen Daten waren ein unsigned int. Mit dem uint Typ und BitConverter.ToUInt16 behoben.

1

Ganzzahlen werden in Big Endian-Reihenfolge in JPEG gespeichert. Wenn Sie sich auf einem Little-Endian-System (z. B. Intel) befinden, müssen Sie die Reihenfolge der Bytes im Längenfeld umkehren. Längenfelder sind unsigniert.

+0

Vielen Dank, aber ich habe bereits versucht, die zwei Bytes umzukehren (siehe das Ende meiner Frage). Das unsigned int war die Lösung. – Arno