【问题标题】:How to append byte data in C++?如何在 C++ 中附加字节数据?
【发布时间】:2013-09-04 07:59:06
【问题描述】:

如何将字节数组uint8_t[8]的八个值追加到一个变量uint64_t中?

 uint8_t array[8] = { 0xe4, 0x52, 0xcb, 0xbe, 0xa4, 0x63, 0x95, 0x8f };

 uint64_t result = 0;
 for(int i = 0; i < sizeof(array); ++i)
 {
     // what to do here?
 }

在上面的示例中,result 应该以值 0xe452cbbea463958f 结尾。我正在寻找一个不完全绑定到数组中的八个元素的通用解决方案。

【问题讨论】:

  • result &lt;&lt;= 8; result |= array[i];
  • @H2CO3:是的,可以。可以将一个转换为另一个吗?
  • @RobertHarvey 据我所知,没有(严格别名)。不过,如果机器是大端(现在不太可能),则可以使用memcpy()
  • @H2CO3:完全正确。 :)
  • @danijar 是的,它会的。它只取数组开头的 8 个字节并将其放入result

标签: c++ integer hex byte bytearray


【解决方案1】:

如果只想按顺序复制字节,最好的方法是使用memcpy:

memcpy(&result, array, sizeof(array));

但是,如果您想将字节解释为更大数字的一部分,并将它们视为大端顺序,则必须使用 H2CO3 提供的循环:

result = 0;
for (int i=0; i<sizeof(array); i++) {
    result <<= 8;
    result |= array[i];
}

如果您希望能够将相同的变量用作 64 位整数的字节数组,您可以简单地进行类型转换。或者,如果您使用 C 语言编写,您可以使用联合。

union myBigInt {
    uint8_t asBytes[8];
    uint64_t asLongInt;
};

【讨论】:

  • 从工会的非活动成员读取是未定义的行为。不过其他信息很好。
  • @BenVoigt 这同样适用于 C,但不适用于 C++。 :)
  • 哈,我的 C++ 一定生锈了。太多的 Javascript 和 Python。更正了我的答案。
  • @slashingweapon 确实!这种非常高级的语言非常适合 1. 学习(而初学者希望专注于“正常工作”的算法,而不是必须处理内存和其他东西),2. 脚本,但它们绝对不适合裸教 -金属编程。
【解决方案2】:

是这样的:

result <<= 8;
result |= array[i];

|= 运算符的意思是“按位或后赋值”。在result 向左移动 8 位之后(&lt;&lt;= 所做的),新字节被插入到它的末尾。

【讨论】:

    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2018-02-05
    • 2018-05-03
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多