如果我的理解是正确的,我正在寻找确认,如果有更优雅的方法可能需要提供信息 .
我找到了几个答案,但我认为在签名方面他们错了 .
例如,当您通过串行端口接收数据时,这是常见的情况 . 你得到了一系列的char值 . 在这种情况下,我有4个值的数组 . 它们代表4个字节的数字 .
char a[] {-103,-103,-103,-103};
I would like to convert 32-bit unsinged little endian to unsigned 32-bit value of the platform:
uint32_t p = static_cast<uint32_t>(
static_cast<uint8_t>(a[0]) | static_cast<uint8_t>(a[1])<<8 |
static_cast<uint8_t>(a[2])<<16 | static_cast<uint8_t>(a[3])<<24 );
uint32_t q = static_cast<uint32_t>(
static_cast<uint8_t>(a[0]) + 256U*static_cast<uint8_t>(a[1]) +
65536U*static_cast<uint8_t>(a[2]) + 16777216U*static_cast<uint8_t>(a[3]) );
断言是否正确?
-
如果我没有显式地将char值转换为uint8_t,那么如果char值为vas,则自动提升为int将创建负值 .
-
甚至uint8_t将在位移之前被提升为int (and not to unsigned int) .
-
较大的值将被提升为long long int .
-
今天不支持高于64位的值 .
-
第二版更具便携性 . (它在AMD64 gcc(和clang)上产生与第一个完全相同的二进制代码)
This is 32-bit signed litttle endian conversion to platform's signed 32 bit value:
int q = static_cast<uint8_t>(a[0]) + 256U*static_cast<uint8_t>(a[1]) +
65536U*static_cast<uint8_t>(a[2]) + 16777216U*a[3];
请注意,最后一个值未转换为unsigned char以保留符号 .