如何计算bfOffBits

时间:2015-05-04 21:13:22

标签: c bitmap byte

我正在尝试使用C手动读取和打开BMP文件,在阅读BMP规范并了解这些文件的工作方式后,标头的字节定义与bfOffBits和{biWidth之类的字节相同{1}}。因此,例如bfOffBits等于4个字节,在我的测试位图中是'8A 04 00 00'。我如何从这里得到图像偏移数据的十进制等值?

我对C非常非常新,所以考虑到我使用的主要语言是PHP,语言的工作原理与我有很大的不同,所以对我来说很容易:)

目前,我在C中使用这个函数感觉完全错误但是对某些偏移值而不是其他偏移值有效

int calculateBytes(int bytes[4]) {
    int Value = bytes[0];
    if (bytes[1] > 0) {
        if (bytes[0] == 0) {
            Value = 256;
        }
        Value = Value * bytes[1];
    }
    if (bytes[2] > 0) {
        if (bytes[1] == 0) {
            if (bytes[0] == 0) {
                Value = 256;
            }
            Value = Value * 256;
        }
        Value = Value * bytes[2];
    }
    if (bytes[3] > 0) {
        if (bytes[2] == 0) {
            if (bytes[1] == 0) {
                if (bytes[0] == 0) {
                    Value = 256;
                }
                Value = Value * 256;
            }
            Value = Value * 256;
        }
        Value = Value * bytes[3];
    }
    return Value;
}

2 个答案:

答案 0 :(得分:3)

你可以这样做:

char bytes[] = {0x8A, 0x04, 0x00, 0x00};
int* p_int = (int*)bytes; // Unsafe version ,doesn't take into account endianness
int num2 = bytes[0] | ( (int)bytes[1] << 8 ) | ( (int)bytes[2] << 16 ) | ( (int)bytes[3] << 24 ); // Safe version
printf("%d %d\n", *p_int, num2);

所以你的功能看起来像这样:

int calculateBytes(int bytes[4]) {
    int num = bytes[0]
              | ( (int)bytes[1] << 8 )
              | ( (int)bytes[2] << 16 )
              | ( (int)bytes[3] << 24 );
    return num;
}

答案 1 :(得分:2)

发布值&#39; 8A 04 00 00&#39;看起来像小Endian&#39;。

您使用的架构是否是小Endian&#39;。如果是这样,只需将值读入int。否则,反转4个字节的顺序。

然后用以下内容打印结果值:printf(&#34; offset:%d \ n&#34;,myInt);

转换小端的简单方法&#39;到大Endian&#39;在32位架构上。

int convert( char *pBytes )
{
    int result = 0;
    result = pBytes[3];
    result <<= 8;
    result += pBytes[2];
    result <<= 8;
    result += pBytes[1];
    result <<= 8;
    result += pBytes[0];
    return( result );
} // end function: convert