【问题标题】:Obtaining an integer given its 4-byte unsigned integer little-endian form? (C++)给定 4 字节无符号整数 little-endian 形式的整数? (C++)
【发布时间】:2011-02-17 09:20:10
【问题描述】:

我在这里可能非常错误,所以请指出我可能有的任何误解或错误。

这个赋值的输入是一个由一些字符组成的字符串,后跟一系列小端形式的 4 字节无符号整数。我将输入读入一个 STL 字符串,并使用 substring 函数将整数隔离到一个新字符串中。

据我了解,最低有效位将从最左边的字节开始存储。然后将二进制表示为 (0000 0000 0000 0001 1111 1111 1111 1111) 的无符号整数 131071(dec) 存储为 1111 1111 1111 1111 0000 0001 0000 0000

一次解析这个新字符串 4 个字节,我认为第一个字节将包含值 0-255 的位,第二个字节为 256-65535 等第 3 个和第 4 个字节。

我取出第一个字节,将其转换为无符号整数,然后将其移位 24 位,我对第 2 和第 3 个字节做了相同的操作,除了分别移位 16 位和 8 位。

我得到了 255 和 65535 的第 1 和第 2 字节,但第 3 字节为 0。我相信我必须在某处使用 & 运算符,但我不知道在哪里。如果有人能给我一些建议,或者用一种不太愚蠢的方式来完成同样的任务,我将不胜感激。

【问题讨论】:

  • 我认为我们需要查看一些代码来找出问题所在
  • "leftmost byte" 有点模棱两可。在我读过的关于微架构的手册中,地址总是向左增加。换句话说,最左边的字节是具有最高地址的字节。但我假设你把最左边的意思是“最低地址”。 (通常我对此并不迂腐,但在谈论字节序时左右有点重要)
  • 它将被存储为 1111 1111 1111 1111 0001 0000 0000 0000。可能只是一个错字。

标签: c++ bitwise-operators endianness


【解决方案1】:

如果您的第 3 个字节为 0,并且您的数据与您的描述相匹配,则您的代码中存在错误。以下代码将正确转换您的示例数据。

// Data from file
unsigned char Buffer[] = { 255, 255, 1, 0 };

// Convert the LSB data to an unsigned int
unsigned int Result = 0;
for (int i = 0; i < 4; ++i) {
  Result |= static_cast<unsigned int>(Buffer[i]) << (i*8);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2010-12-03
    • 2012-04-15
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多