![](/img/trans.png)
[英]C++: Difference of two unsigned 64-bit integer in a signed 64-bit integer
[英]C/C++ Convert an array of 8 bytes into a 64-bit integer
在我的一项任务中,我需要将 DWORD 存储到 BYTE(s) 中,然后将它们转换回来。 平台仅限 windows。
我在这个网站上发现了以下内容:
//Convert an array of four bytes into a 32-bit integer.
DWORD getDwordFromBytes(BYTE* b)
{
return (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
};
这适用于将 4 个字节转换为 1 个 DWORD,但是您将如何为 DWORD64 执行此操作?
我尝试了以下方法,但由于我丢失数据而无法正确返回:
DWORD64 getDwordFromBytes64(BYTE* b)
{
return ((DWORD64)b[0]) | ((DWORD64)b[1] << 8) | ((DWORD64)b[2] << 16) | ((DWORD64)b[3] << 24);
};
假设我有一个字节数组:
BYTE[] = {0x38,0xf0,0x07,0x40,0x01,0x00,0x00,0x00}; //000000014007F038
我需要正确地从中取回 000000014007F038 (DWORD64) 。
如果有人能给我一个解决方案,我将非常感激。
更新:
如果您关心字节顺序并且不想使用任何指针或联合双关语
#define to64b(arr) (((uint64_t)(((uint8_t *)(arr))[7]) << 0)+\
((uint64_t)(((uint8_t *)(arr))[6]) << 8)+\
((uint64_t)(((uint8_t *)(arr))[5]) << 16)+\
((uint64_t)(((uint8_t *)(arr))[4]) << 24)+\
((uint64_t)(((uint8_t *)(arr))[3]) << 32)+\
((uint64_t)(((uint8_t *)(arr))[2]) << 40)+\
((uint64_t)(((uint8_t *)(arr))[1]) << 48)+\
((uint64_t)(((uint8_t *)(arr))[0]) << 56))
#define to64l(arr) (((uint64_t)(((uint8_t *)(arr))[0]) << 0)+\
((uint64_t)(((uint8_t *)(arr))[1]) << 8)+\
((uint64_t)(((uint8_t *)(arr))[2]) << 16)+\
((uint64_t)(((uint8_t *)(arr))[3]) << 24)+\
((uint64_t)(((uint8_t *)(arr))[4]) << 32)+\
((uint64_t)(((uint8_t *)(arr))[5]) << 40)+\
((uint64_t)(((uint8_t *)(arr))[6]) << 48)+\
((uint64_t)(((uint8_t *)(arr))[7]) << 56))
uint64_t toUnsigned64(const void *arr, int bigend)
{
return bigend ? to64b(arr) : to64l(arr);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.