【发布时间】:2012-11-27 00:55:05
【问题描述】:
我还没有找到回答这种确切行为的问题,不知何故我就是不明白发生了什么:
我将 Windows 位图文件 (bmp) 的内容读入一个数组,稍后使用该数组提取所需信息:
char biHeader[40];
// ...
source.read(biHeader,40);
// ...
int biHeight = biHeader[8] | (biHeader[9] << 8) | (biHeader[10] << 16) | (biHeader[11] << 24);
在此之后,biHeight 显示为-112,这是完全错误的,因为它应该是400。
因此,我查看了文件的 hexdump。读取的内容是:
90 01 00 00
将字节顺序更改为大端序会得到0x190,这是十进制的400,正如预期的那样。
如果我将上面的代码更改为:
unsigned char biHeader[40];
// ...
source.read((char*)biHeader,40);
// ...
int biHeight = ... (same as before)
...然后我得到预期值。这是怎么回事?
还有:您将如何读取这些数据?
【问题讨论】:
-
还有一件事:我真的需要转换为 int 而不是 unsigned int 因为值可能是负数!
-
通常 BITMAPINFOHEADER 被读取为一个结构,其中 biHeight 至少在 windows 平台上是一个 LONG
-
我决定不将其作为结构读取,因为此标头有多个版本(末尾有不同的字段)。作为一个长?根据文件格式定义,这是错误的。或者,更具体地说:biHeight 由 4 个字节组成(而不是更多;因为 LONG 可能是 8 个字节)
标签: c++ c serialization file-io type-conversion