簡體   English   中英

C/C++ 將8字節數組轉換為64位 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) 。

如果有人能給我一個解決方案,我將非常感激。

更新:

  • 我可以接受任何解決方案,無論是 C 還是 C++。
  • “字節順序”可以忽略。

如果您關心字節順序並且不想使用任何指針或聯合雙關語

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM