将连续字节读取为一个整数

时间:2016-05-13 17:08:32

标签: c++ binary

我是新来的,想问这个问题。 我正在使用二进制文件,每个字节,多个字节或甚至一个字节的部分具有不同的含义。

我到目前为止所尝试的是将一些字节(在我的示例中为4)作为一个块读取。

我将它们用十六进制表示,如:00 1D FB C8

使用以下代码,我单独阅读:

for (int j = 36; j < 40;j++)
    {
         cout << dec << (bitset<8>(fileBuf[j])).to_ulong();         
    }

其中j是文件中字节的位置。前面的代码给了我029251200这是错误的。我想要的是一次读取4个字节并获得1965000

的答案

我感谢任何帮助。 谢谢。

3 个答案:

答案 0 :(得分:1)

DWORD final = (fileBuf[j] << 24) + (fileBuf[j+1] << 16) + (fileBuf[j+2] << 8) + (fileBuf[j+3]);

还取决于你想要什么样的endian(ABCD / DCBA / CDAB)

编辑(由于低代表而无法回复,今天才加入)

  

我试图扩展bitset,但它只给出了第一个字节的值

它不起作用,因为fileBuf是99%字节数组,从8bit扩展到32bit(int)不会有任何区别,因为它仍然是一个8位的字节数组。您必须在数学上将4个数组元素的值计算为原始整数表示。见上面的代码编辑

答案 1 :(得分:0)

答案不是“错”这是一个逻辑错误。您没有存储值并添加计算

C8是十进制形式的200,因此您不会将该值附加到原始子集。

它吐出的答案,实际上就是你编程的目的。

您需要将bitset扩展到更大的数量以附加其他十六进制数字或提供其他输出方式

答案 2 :(得分:0)

保留问题的格式,您可以这样做:

    //little-endian
{
        int i = (fileBuf[j]<<0) | (fileBuf[j+1]<<8) | (fileBuf[j+2]<<16) | (fileBuf[j+3]<<24);
        cout << dec << i;
}

    // big-endian
{
        int i = (fileBuf[j+3]<<0) | (fileBuf[j+2]<<8) | (fileBuf[j+1]<<16) | (fileBuf[j]<<24);
        cout << dec << i;
}