2016-08-09 7 views
2

私はJPEGファイルを解析しようとしています。 、この2バイトからintへの変換で何が問題になっていますか?

0xFFの+マーカ番号(1バイト)+データサイズ(2バイト)+データ(Nバイト)

だから、私は0xFFが発生したとき:This pageの形式は、次のされていることを述べています私は(sは、JPEGファイルストリームである)このようなデータを読む:

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

問題はその後、sizeの値であり、私ができるようにしようとするため、次の行は、例外を発生させる原因と-7937(あります-7937-ロングバイト[] )。 b[0] == 255およびb[1] == 224

私はBitConverter.ToInt16を正しく使用しないと思われますが、私が間違っていたものは見つかりません。

BitConverter doc page

は、「アレイ内のバイトの順序は、コンピュータ・システムのアーキテクチャのエンディアンを反映しなければならない」と言うが、私はこれを行うとき:

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

を実際にされていない...私はsize == -32を取得しますより良い。

問題が何ですか?

+7

おそらく、BitConverter.ToUInt16()を使用してください。 –

+1

ビットは明らかに '0xFF70'または' 0x70FF'です。どちらも最上位ビットが設定されているので、Matthewはそうだと思います。署名されていない単語。 'uint size = BitConverter.ToUInt16()'を使います。 –

+1

を見てください。http://stackoverflow.com/a/8227753/6007877 0xE1について忘れてしまったと思います – gismo

答えて

1

問題のデータは符号なしintであった。 uintタイプを使用し、BitConverter.ToUInt16を修正しました。

1

整数はJPEGでビッグエンディアンの順序で格納されます。リトルエンディアンシステム(Intelなど)を使用している場合は、長さフィールドのバイトの順序を逆にする必要があります。長さフィールドは符号なしです。

+0

ありがとう、私はすでに2バイトを逆にしようとしました(私の質問の終わりを参照してください)。 unsigned intが解決策でした。 – Arno

関連する問題