在 C 中为位图文件指定数组中的十六进制值
Especifying Hexadecimal values in an array in C for bitmap files
我有一个关于如何读取位图 header 文件的简单问题。
我有这样的位图数组:
typedef unsigned char byte;
char bitmap[(188*180)+1024+54]; //The image size is 188*180 + the header file of 54 bytes+ the pallete table´s 1024 bytes
我正在根据 bmp header 指定值,但我对大于一个字节的值有疑问。例如,我的图像宽度为 288,十六进制为 0x120。但是我不能简单地说:
bitmap[19] = 0x120;
因为它大于一个字节。根据我读到的,我有一个双字来存储我的图像高度(即 4 个字节),所以我可以使用 bitmap[20]
、bitmap[21]
和 bitmap[22]
来存储整个数字。
我应该如何划分数字以获得存储在 header 文件中的相同值?我不确定在打开 bmp 文件时这些值是被添加还是被读取为单个十六进制数。
TL;DR
值作为单个 DWORD
(32 位)数字读取。
BMP 文件格式在 Wikipedia 以及 Internet 上的许多地方都有描述。请注意,正确的偏移量是 18,而不是您在问题中建议的 19。所以这四个字节位于偏移量 18、19、20 和 21。
在您的代码中:
typedef unsigned char byte;
char bitmap[(188*180)+1024+54];
强制图片宽度为0x120
,可以这样做:
bitmap[18] = 0x20;
bitmap[19] = 0x01;
bitmap[20] = 0x00;
bitmap[21] = 0x00;
或者在一般情况下:
uint32_t width = ...; // 0x120 in your case, any value in general case
bitmap[18] = width & 0xff;
bitmap[19] = (width >> 8) & 0xff;
bitmap[20] = (width >> 16) & 0xff;
bitmap[21] = (width >> 24) & 0xff;
请注意 least-significant 字节应位于较低地址(little-endian 顺序)- 这并不总是记录在案,但在谈论 Windows 中的数据结构时总是暗示。
我有一个关于如何读取位图 header 文件的简单问题。
我有这样的位图数组:
typedef unsigned char byte;
char bitmap[(188*180)+1024+54]; //The image size is 188*180 + the header file of 54 bytes+ the pallete table´s 1024 bytes
我正在根据 bmp header 指定值,但我对大于一个字节的值有疑问。例如,我的图像宽度为 288,十六进制为 0x120。但是我不能简单地说:
bitmap[19] = 0x120;
因为它大于一个字节。根据我读到的,我有一个双字来存储我的图像高度(即 4 个字节),所以我可以使用 bitmap[20]
、bitmap[21]
和 bitmap[22]
来存储整个数字。
我应该如何划分数字以获得存储在 header 文件中的相同值?我不确定在打开 bmp 文件时这些值是被添加还是被读取为单个十六进制数。
TL;DR
值作为单个 DWORD
(32 位)数字读取。
BMP 文件格式在 Wikipedia 以及 Internet 上的许多地方都有描述。请注意,正确的偏移量是 18,而不是您在问题中建议的 19。所以这四个字节位于偏移量 18、19、20 和 21。
在您的代码中:
typedef unsigned char byte;
char bitmap[(188*180)+1024+54];
强制图片宽度为0x120
,可以这样做:
bitmap[18] = 0x20;
bitmap[19] = 0x01;
bitmap[20] = 0x00;
bitmap[21] = 0x00;
或者在一般情况下:
uint32_t width = ...; // 0x120 in your case, any value in general case
bitmap[18] = width & 0xff;
bitmap[19] = (width >> 8) & 0xff;
bitmap[20] = (width >> 16) & 0xff;
bitmap[21] = (width >> 24) & 0xff;
请注意 least-significant 字节应位于较低地址(little-endian 顺序)- 这并不总是记录在案,但在谈论 Windows 中的数据结构时总是暗示。