【问题标题】:Binary File interpretation二进制文件解释
【发布时间】:2012-02-10 19:22:48
【问题描述】:

我正在读取一个二进制文件(在 C++ 中)。标题是这样的(以十六进制打印)

43 27 41 1A 00 00 00 00 23 00 00 00 00 00 00 00 04 63 68 72 31 FFFFFFB4 01 00 00 04 63 68 72 32 FFFFFFEE FFFFFFB7

打印出来时使用:

std::cout << hex << (int)mem[c];

有没有一种有效的方法可以在不使用stringstream 的情况下将23(即9th 字节(?))存储为整数?还是stringstream 是最好的方式?

类似

int n= mem[8]

我想将23 存储在n 而不是35

【问题讨论】:

  • 值为1A时要存储什么?

标签: c++ binary


【解决方案1】:

您确实将 23 存储在 n 中。您只会看到35,因为您使用将其转换为十进制以进行显示的例程输出它。如果你能看一下计算机内部的二进制数据,你会发现它实际上是一个十六进制的 23。

你会得到和你一样的结果:

 int n=0x23;

(你可能认为你想要的是不可能的。1E 应该存储在n 中的哪个数字?唯一对应的数字是 31,这就是你得到的。)

【讨论】:

  • 如果您可以查看二进制数据,您会发现它实际上是0000 0000 0010 0011(或0011 0010 0000 0000,或64 位等价物等)。它已被转换为以十六进制显示它与以十进制显示它一样多。我总是发现指出这一点有助于人们理解整数变量中没有固有的基数(二进制除外)。
  • 我实际上在我的答案草稿中就有了这一点,但找不到使其易于理解的方法。但你说得很对,这是很重要的一点。
  • 我明白这一点,但我实际上想稍后在代码中使用数字 23。那么如何例如循环 23 次而不是 35 次(这是我得到的数字)。
  • @Robert:那么你的问题应该更清楚,而且你的标题应该更明确。 “二进制文件解释”与使用 bcd 编码字节有什么关系? (好吧,幸运的是,SO 上有一些读心者)
  • @Robert:如果号码是1E,你想循环多少次?你可以通过(n/16)*16+(n%16)得到你想要的
【解决方案2】:

您的意思是要将值视为二进制编码的十进制吗?在这种情况下,您可以使用以下方式对其进行转换:

unsigned char bcd = mem[8];
unsigned char ones = bcd % 16;
unsigned char tens = bcd / 16;

if (ones > 9 || tens > 9) {
    // handle error
}

int n = 10*tens + ones;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2018-03-23
    • 2018-10-28
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多