[英]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.