这个 2 字节到整数的转换有什么问题?

What's wrong with this 2-bytes-to-int conversion?

我正在尝试解析 JPEG 文件。 This page 表示格式如下:

0xFF+Marker Number(1 byte)+Data size(2 bytes)+Data(n bytes)

所以,当我遇到一个0xFF时,我是这样读取数据的(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] == 255b[1] == 224.

我怀疑我没有正确使用BitConverter.ToInt16,但我找不到我做错了什么。

BitConverter doc page 说 "The order of bytes in the array must reflect the endianness of the computer system's architecture",但是当我这样做时:

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

...我得到 size == -32 这并不是真的更好。

有什么问题吗?

整数在 JPEG 中以 Big Endian 顺序存储。如果您使用的是小端系统(例如 Intel),则需要反转长度字段中字节的顺序。长度字段是无符号的。

有问题的数据是一个无符号整数。使用 uint 类型并 BitConverter.ToUInt16 修复了它。