簡體   English   中英

char []到uint32_t無法正常工作

[英]char[] to uint32_t not working properly

我正在使用以下內容將char[4]轉換為uint32_t

frameSize = (uint32_t)(frameSizeBytes[0] << 24) | (frameSizeBytes[1] << 16) | (frameSizeBytes[2] << 8) | frameSizeBytes[3];

frameSize是一個uint32_t變量,而frameSizeBytes是一個char[4]數組。 例如,當數組包含以下值(十六進制)時

00 00 02 7b

frameSize設置為635,這是正確的值。 此方法還適用於其他字節組合,但以下情況除外

00 00 9e ba

在這種情況下, frameSize設置為4294967226,根據此網站此值是不正確的,因為它應該是40634。 為什么會發生這種現象?

您的char類型已在您的特定實現中簽名,並且對大多數運算符進行整數提升。 在使用有unsigned char數組元素的地方使用強制轉換為unsigned char

編輯:實際上,正如Olaf在評論中指出的那樣,您實際上應該更喜歡對unsigned int (假定為普通的32位unsigned int )或uint32_t進行強制轉換,以避免<< 24 shift操作可能出現的不確定行為。

為了使事情保持整潔,我建議使用以下內聯函數:

static inline uint32_t be_to_uint32(void const *ptr)
{
    unsigned char const *p = ptr;
    return p[0] * 0x1000000ul + p[1] * 0x10000 + p[2] * 0x100 + p[3];
}

注意:通過使用unsigned long常量,此代碼避免了將unsigned char提升為有符號int ,然后使乘法/移位引起整數溢出(C的令人討厭的歷史特征)的問題。 當然,您也可以使用((uint32_t)p[0]) << 24如Olaf所建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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