const unsigned char* p;
int64_t u = ...; // ??
从 p 指向的 8 个字节中读取 64 位二进制小端整数的推荐方法是什么?在 x64 上应该执行一条机器指令,但在大端硬件上需要交换。如何以最佳方式和便携方式做到这一点?
Carl 的解决方案很好,足够便携,但不是最优的。这就引出了一个问题:为什么 C/C++ 不提供更好和标准化的方法来做到这一点?这不是一个不常见的结构。
常见的:
u = (int64_t)(((uint64_t)p[0] << 0)
+ ((uint64_t)p[1] << 8)
+ ((uint64_t)p[2] << 16)
+ ((uint64_t)p[3] << 24)
+ ((uint64_t)p[4] << 32)
+ ((uint64_t)p[5] << 40)
+ ((uint64_t)p[6] << 48)
+ ((uint64_t)p[7] << 56));
几乎是城里唯一的便携性游戏——否则很难避免潜在的对齐问题。
这个答案确实假设一个 8-bit char
。如果您可能需要支持不同大小char
的 s,则需要一个预处理器定义来检查 CHAR_BIT 并为每个定义做正确的事情。
Carl Norum 是对的——如果你也想可读,你可以写一个循环(编译器无论如何都会展开它)。这也将很好地处理非 8-bit char
s。
u = 0;
const int n = 64 / CHAR_BIT + !!(64 % CHAR_BIT);
for (int i = 0; i < n; i++) {
u += (uint64_t)p[i] << (i * CHAR_BIT);
}
I used the following code to reverse the byte order for any variable. I used it to convert between different "Endianess".
// Reverses the order of bytes in the specified data
void ReverseBytes(LPBYTE pData, int nSize)
{
int i, j;
for (i = 0, j = nSize - 1; i < j; i++, j--)
{
BYTE nTemp = pData[i];
pData[i] = pData[j];
pData[j] = nTemp;
}
}