在此代码中*(int *)&data [18]实际做什么?

问题描述 投票:2回答:1

我在使用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 *intint width = (int)data[18];的简单转换不起作用?

c++ syntax bmp bitmapimage
1个回答
0
投票

根据bitmap header format,位图的宽度(以像素为单位)作为有符号整数存储在字节18中,宽度为32位。语法

int width = *(int*)&data[18];

读取字节18到21(含在内)(32位),并将结果解释为整数。

怎么样?

因此,基本上,将data[18]的地址读取为整数。

为什么简单地对`int`进行强制转换不起作用?

[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 charint的简单转换也将产生4个字节,但是data中的信息只有一个字节。

© www.soinside.com 2019 - 2024. All rights reserved.