我使用以下内容将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,根据this website,它是不正确的,因为它应该是40634。为什么会发生这种情况?
答案 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
。