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?
Vielleicht ist es ein unsigned kurz, so sollten Sie verwenden 'BitConverter.ToUInt16()' –
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()'. –
siehe http://stackoverflow.com/a/8227753/6007877 Ich denke, Sie haben über die 0xE1 vergessen – gismo