我还没有找到一个问题回答这个确切的行为,不知何故,我只是不明白是怎么回事:C/C++:将char []转换为int失败,将unsigned char []转换为int,原因何在?
我将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至少 – Chubsdad
我决定不将它作为结构体读取,因为这个头文件有多个版本(结尾有不同的字段)。 作为一个长?根据文件格式定义,这是错误的。 或更具体地说:biHeight由4个字节组成(不多于;因为LONG可能是8个字节) –