我是新来的,想问这个问题。 我正在使用二进制文件,每个字节,多个字节或甚至一个字节的部分具有不同的含义。
我到目前为止所尝试的是将一些字节(在我的示例中为4)作为一个块读取。
我将它们用十六进制表示,如:00 1D FB C8
。
使用以下代码,我单独阅读:
for (int j = 36; j < 40;j++)
{
cout << dec << (bitset<8>(fileBuf[j])).to_ulong();
}
其中j
是文件中字节的位置。前面的代码给了我029251200
这是错误的。我想要的是一次读取4个字节并获得1965000
我感谢任何帮助。 谢谢。
答案 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;
}