我在使用C ++读取BMP文件时遇到了这种语法
#include <fstream>
int main() {
std::ifstream in('filename.bmp', std::ifstream::binary);
in.seekg(0, in.end);
size = in.tellg();
in.seekg(0);
unsigned char * data = new unsigned char[size];
in.read((unsigned char *)data, size);
int width = *(int*)&data[18];
// omitted remainder for minimal example
}
而且我不明白这行是什么
int width = *(int*)&data[18];
实际上正在做。为什么从unsigned char *
到int
,int width = (int)data[18];
的简单转换不起作用?
根据bitmap header format,位图的宽度(以像素为单位)作为有符号整数存储在字节18中,宽度为32位。语法
int width = *(int*)&data[18];
读取字节18到21(含在内)(32位),并将结果解释为整数。
&data[18]
在索引18获得对unsigned char
的引用(int*)
从unsigned char*
强制转换为(int*)
以避免loss of precision on 64 bit architectures*(int*)
取消引用以获取参考值因此,基本上,将data[18]
的地址读取为整数。
[sizeof(data[18])
是1
,因为unsigned char
是一个字节(0
-255
),但是如果系统是32位,则sizeof(&data[18])
是4
,如果是64-位,则是8
。位,它可以是larger (or even smaller for 16-bit systems),但16位系统除外,它至少应为4
字节。显然,在这种情况下不希望读取超过4
个字节,并且强制转换为(int*)
并随后取消引用int
会产生4
字节,实际上是18到21之间的4个字节。从unsigned char
到int
的简单转换也将产生4个字节,但是data
中的信息只有一个字节。