我正在编写一个C程序来读取和解析BMP头。前两个字符是字符,我打印很好。但是,所有其他位都是小端格式的整数,所以我将它们向后存储。在十六进制中,我得到了正确的答案。但是,当我尝试将它们转换为int(为了便于阅读)时,我得到的数字无效。
bmp.c -
printf("file size: "%02x %02x %02x %02x\n", bmp->size[0], bmp->size[1], bmp->size[2], bmp->size[3]);
printf("file size: "%d\n", bit2int(bmp->size));
bit2int函数 -
int bit2int(void *thing)
{
return *(int*)thing;
}
输出 - (实际文件大小为415,798字节)
file size: 00 06 58 36
file size: 911738368
编辑1 - 我正在使用的功能
void storebackwards(void *dst, void *src, int offset, int n) {
for(int i = n; i > 0; i--)
memcpy( dst + n - i, src + offset + i - 1, 1);
}
答案 0 :(得分:2)
也许
int bit2int(unsigned char *thing)
{
return thing[3] + 256*thing[2] + 65536*thing[1] + 16777216*thing[0];
}
答案 1 :(得分:2)
BMP大小在 little endian 中。所以你可能正在交换字节,从而得到一个大的endian整数,这是没用的。
然后你正在进行的演员表违反了严格的别名规则和它不可移植。
这是一小段代码,试图尽可能地移植。它读取前2个头字节,然后是4个大小的字节,并重建大小,假设值是小端:
#include <stdio.h>
#include <stdint.h>
int main()
{
FILE *f = fopen("foo.bmp","rb");
if (f)
{
unsigned char header[3] = {'\0'};
unsigned char size_buffer[4];
int nb_read = fread(header,2,1,f);
nb_read = fread(size_buffer,4,1,f);
uint32_t size = size_buffer[0] + (size_buffer[1]<<8) +
(size_buffer[2]<<16) + (size_buffer[3]<<24);
printf("header: %s, size %lu\n",header,(unsigned long)size);
fclose(f);
}
}
答案 2 :(得分:2)
我喜欢user1063935'解决方案,但会使用移位运算符
int bit2int(unsigned char *thing)
{
return thing[3] + thing[2] << 8 + thing[1] << 16 + thing[0] << 24;
}