【问题标题】:Reading consecutive bytes as one integer将连续字节读取为一个整数
【发布时间】:2016-05-14 01:39:17
【问题描述】:

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

到目前为止,我一直在尝试将多个字节(在我的示例中为 4)读取为一个块。

我有它们的十六进制表示形式,例如:00 1D FB C8。

使用下面的代码,我分别阅读:

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

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

感谢您的帮助。 谢谢你。

【问题讨论】:

  • 什么是fileBuf?
  • fileBuf 是一个指针,我用它来读取二进制文件
  • 也就是说,你是怎么定义fileBuf的。是字符 [4] 吗?如果是 int[4] 你问如何转换?是scanf()的结果吗?
  • 坏消息,伙计。这:cout &lt;&lt; dec &lt;&lt; (bitset&lt;8&gt;(fileBuf[j])).to_ulong(); 不是在读杰克。
  • 您的问题不清楚。向我们展示您使用这两种方法尝试过的内容以及获得的结果。然后向我们展示您期望得到的结果。

标签: c++ binary


【解决方案1】:
DWORD final = (fileBuf[j] << 24) + (fileBuf[j+1] << 16) + (fileBuf[j+2] << 8) + (fileBuf[j+3]);

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

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

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

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

【讨论】:

  • 是的!!!很难将 OP 与班次操作员混淆。 +1 提及字节序。
  • 没什么好混淆的。人们甚至在使用标准库之前都应该学习基本操作。你不是从头到尾读这本书吗? :)
  • 谢谢@TNTworks,您的解决方案有效。老实说,我不知道代码在后台到底做了什么,我也不知道什么是字节序。很快就会搜索它。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我试图扩展 bitset,但它只给出了第一个字节的值
  • 是的,它很棘手,TNTWorks 是正确的解决方案。它是 a = 1 + 2 + 5 + 6 与 a = 1256 的差异,他的解决方案提供了正确的符号,用于以正确的顺序移动位。
【解决方案3】:

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

    //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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多