【问题标题】:Reading 4 bytes from the end of a char array从 char 数组末尾读取 4 个字节
【发布时间】:2014-09-17 20:05:12
【问题描述】:

如果我有一个 char* 数组:

char* c = getBytesFromSomewhere();

我想将最后 4 个字节读入一个 uint,然后将前 4 个字节等读入。我试过这个:

char* end = &c[size-5];

获取指向数组最后 4 个字节的指针,然后:

unsigned int n = *(reinterpret_cast<int *>(end));

但它似乎不起作用....我做错了什么?

【问题讨论】:

  • 可能是endianness 问题吗?
  • 什么似乎不起作用?
  • 另外,你减去的太多了。
  • 你试过memcpy吗?
  • 这也违反了严格的别名,而且你有潜在的对齐问题。使用memcpy

标签: c++ arrays binary byte reinterpret-cast


【解决方案1】:

假设返回的数组大小为 8,它在内存中看起来像这样:

+---+ | c | +---+ | v +---+---+---+---+---+---+---+---+ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +---+---+---+---+---+---+---+---+

(里面的数字是索引。)

现在,如果您创建一个新变量e 指向c + size,它将指向数据末尾之外的一个:

+---+ +---+ | c | |电子| +---+ +---+ | | v v +---+---+---+---+---+---+---+---+ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +---+---+---+---+---+---+---+---+

如果你从e 中减去1,它现在指向索引7

+---+ +---+ | c | |电子| +---+ +---+ | | v v +---+---+---+---+---+---+---+---+ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +---+---+---+---+---+---+---+---+

如果你减去两个(总共)e 将指向索引 6,减去 3e 将指向索引 5 并减去 4 并且指向的索引将是4。如果你减去5 指针e 将指向索引3

+---+ +---+ | c | |电子| +---+ +---+ | | v v +---+---+---+---+---+---+---+---+ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +---+---+---+---+---+---+---+---+

这不是最后四个字节,而是最后 五个 个字节。

所以你应该这样做,例如

char* end = c + size - 4;  /* Subtract by 4 and not 5 */

如果数据来自其他系统,例如,您还应该小心 endianness。通过互联网。

【讨论】:

    【解决方案2】:

    在下面的代码中我这样做了:

    char* end = (c + strlen(c) - 5);
    unsigned int tst = 0;
    tst = c[0];
    tst = ((tst << 8) | c[1]);
    tst = ((tst << 8) | c[2]);
    tst = ((tst << 8) | c[3]);
    

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多