如何将字节数组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
结尾。我正在寻找一个通用解决方案,它不受数组中八个元素的约束。
答案 0 :(得分:3)
如果您只想按顺序复制字节,最好的方法是使用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;
};
答案 1 :(得分:3)
这是:
result <<= 8;
result |= array[i];
|=
运算符表示“按位OR后赋值”。在result
向左移动8个位置(<<=
执行的操作)后,新字节将插入到其末尾。