这个 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] == 255
和 b[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
修复了它。
我正在尝试解析 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] == 255
和 b[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
修复了它。