适当且可移植地将char [4]转换为uint32_t,int32_t

时间:2018-12-09 07:25:14

标签: c++

如果我的理解正确,我正在寻求确认,如果有更优雅的方法,我可能会寻求信息。

我找到了几个答案,但我认为在签名方面它们是错误的。

常见的情况是,例如,您通过串行端口接收数据。您将获得一系列char值。在这种情况下,我有4个值的数组。它们代表4个字节的数字。

char a[] {-103,-103,-103,-103};

我想将32位未加编码的小端字节序转换为平台的无符号32位值:

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值变为负数,则自动提升为int将创建负值。
  • 即使uint8_t在移位之前也将提升为int (而不是未签名的int)
  • 更大的价值将被提升为long long int。
  • 今天不支持64位以上的值。
  • 第二版更便于移植。 (它在AMD64 gcc(和clang)上产生与第一个完全相同的二进制代码)

这是将32位带符号小数点字节序转换为平台的带符号32位值:

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];

请注意,最后一个值未转换为无符号字符以保留符号。

0 个答案:

没有答案