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

时间:2016-08-09 11:08:00

标签: c# parsing jpeg

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

  

0xFF +标记号(1字节)+数据大小(2字节)+数据(n字节)

所以,当我遇到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表示"数组中的字节顺序必须反映计算机系统体系结构的字节顺序,但是当我这样做时:

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

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

问题是什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

有问题的数据是unsigned int。使用uint类型和BitConverter.ToUInt16修复了它。