gpt4 book ai didi

c++ - C/C++ 将8字节数组转换为64位整数

转载 作者:行者123 更新时间:2023-11-27 23:36:20 25 4
gpt4 key购买 nike

在我的一项任务中,我需要将 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)。

如果有人能给我一个解决方案,我将不胜感激。

更新:

  • 我可以接受任何解决方案,无论是 C 还是 C++。
  • “字节顺序”可以忽略。

最佳答案

如果您关心字节顺序并且不想使用任何指针或 union 双关语

#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);
}

关于c++ - C/C++ 将8字节数组转换为64位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58951095/

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