如何将4位字符数组转换为Int?

时间:2018-03-23 21:42:36

标签: c casting bitmap bit

我正在编写一个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);
}

3 个答案:

答案 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);
   }

}
  • 代码可以在没有问题的大端架构上编译
  • 该文件以二进制形式打开,因此适用于Windows&amp;的Linux
  • 为简单起见,我在阅读标题时省略了大小检查。它可以很容易地添加。

答案 2 :(得分:2)

我喜欢user1063935'解决方案,但会使用移位运算符

int bit2int(unsigned char *thing)
{   
    return thing[3] + thing[2] << 8 + thing[1] << 16 + thing[0] << 24;
}