【发布时间】:2014-07-22 16:11:15
【问题描述】:
我正在处理一个项目,该项目包含来自二进制文件的不同位大小的变量。例如,文件的一行(十六进制)可能看起来像“FF C0 AA 00 FE”。例如,从这一行开始,我需要的信息是 4 位、7 位、11 位、8 位等。 我遇到的问题是提取的一些数字将被签名,而其他数字将是无符号的(4 位和 7 位可能是有符号的,11 位和 8 位可能是无符号的)。
我最初是通过屏蔽和移位十六进制值来提取 4、7、11、8 位的 c++ char/short/int。但是,如果我查看二进制的 4 位,它将显示为 00001011。这个数字应该是基于前导 1 的负数(应该只是 4 位 1011),但 C++ 将其识别为正数,因为它正在查看所有8 位。
另一个澄清的例子,我可能会从文件中提取 11 位为 (11100101101),但在 c++ 短格式中它显示为 (0000011100101101),应该基于 11 位中的前导 1 进行签名。
我想知道处理这个问题的理想方法是什么。我正在考虑创建一个位/字节类,唯一的问题是位大小不同(4、7、11、8)。
谢谢,希望它有意义。我对 C++ 中的二进制相当陌生,所以可能有一个我没见过的内置函数。
【问题讨论】:
-
"FF C0 AA 00 FE" 是一个4bit, 7bit, 11bit, 8bit,...数据的序列?
-
使用bitfield 结构怎么样?或者
std::bitset似乎对您的情况也有用。 -
如果 FF C0 AA 00 FE 来自文件,在二进制中它显示为 (11111111 1100000 10101010...) 那么我需要将前 4 位作为一个数字,所以 1111。然后下一个数字是 7 位,它将是 1111110(4 位来自 FF,4 位来自 C0),11 位将是 00000101010,等等...
标签: c++