char []到uint32_t无法正常工作

时间:2015-09-17 20:15:55

标签: c byte

我使用以下内容将char[4]转换为uint32_t

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

frameSizeuint32_t变量,frameSizeByteschar[4]数组。例如,当数组包含以下值(十六进制)

00 00 02 7b

frameSize设置为635,这是正确的值。此方法也适用于其他字节组合,但以下

除外
00 00 9e ba

对于这种情况,frameSize设置为4294967226,根据this website,它是不正确的,因为它应该是40634。为什么会发生这种情况?

2 个答案:

答案 0 :(得分:5)

您的document.getElementsByTagNameNS("http://www.w3.org/2000/svg", "svg")[0] 类型已在您的特定实施中签名,并与大多数运营商进行整数提升。使用转换为char,其中使用了带符号的数组元素。

编辑:实际上正如Olaf在评论中指出的那样,您实际上应该更喜欢强制转换为unsigned char(假设常见的32位unsigned int)或{{1}使用unsigned int移位操作来避免潜在的未定义行为。

答案 1 :(得分:1)

为了保持整洁,我建议使用内联函数:

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)。当然,您也可以按照Olaf的建议使用((uint32_t)p[0]) << 24