gpt4 book ai didi

将 6 字节数组复制到 long long 整型变量

转载 作者:行者123 更新时间:2023-11-30 20:43:36 26 4
gpt4 key购买 nike

我从内存中读取了一个 6 字节 unsigned char 数组。这里的字节序是大字节序。现在我想将存储在数组中的值分配给一个整数变量。我认为它必须是 long long 因为它必须包含最多 6 个字节。

目前我这样分配它:

unsigned char aFoo[6];
long long nBar;
// read values to aFoo[]...
// aFoo[0]: 0x00
// aFoo[1]: 0x00
// aFoo[2]: 0x00
// aFoo[3]: 0x00
// aFoo[4]: 0x26
// aFoo[5]: 0x8e
nBar = (aFoo[0] << 64) + (aFoo[1] << 32) +(aFoo[2] << 24) + (aFoo[3] << 16) + (aFoo[4] << 8) + (aFoo[5]);

memcpy 方法会很简洁,但是当我这样做时

memcpy(&nBar, &aFoo, 6);

这 6 个字节从头开始被复制到 long long 中,因此在末尾有填充零。有没有比我的转移任务更好的方法?

最佳答案

您想要完成的任务称为反序列化或反编码。

对于这么宽的值,使用循环是一个好主意,除非您确实需要最大值。速度,并且您的编译器不会矢量化循环:

uint8_t array[6];
...
uint64_t value = 0;

uint8_t *p = array;
for ( int i = (sizeof(array) - 1) * 8 ; i >= 0 ; i -= 8 )
value |= (uint64_t)*p++ << i;

//左对齐 值 <<= 64 - (sizeof(array) * 8);

请注意,使用 stdint.h 类型和 sizeof(uint8_t) 不能与 1` 不同。只有这些才能保证具有预期的位宽度。移位值时也使用无符号整数。右移某些值是实现定义的,而左移则调用未定义的行为。

如果f您需要一个带符号的值,只需

int64_t final_value = (int64_t)value;

转换后。这仍然是实现定义的,但所有现代实现(可能还有较旧的实现)只是复制值而不进行修改。现代编译器可能会对此进行优化,因此不会有任何损失。

当然,声明可以移动。为了完整起见,我只是将它们放在使用它们的位置之前。

关于将 6 字节数组复制到 long long 整型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35597378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com