我需要将四个有符号字节打包为 32 位整数类型。
这就是我想到的:
int32_t byte(int8_t c) { return (unsigned char)c; }
int pack(char c0, char c1, ...) {
return byte(c0) | byte(c1) << 8 | ...;
}
这是一个好的解决方案吗?它是否便携(不是通信意义上的)?
有没有现成的解决方案,也许是 boost?
我最关心的问题是将负位从 char 转换为 int 时的位顺序。我不知道正确的行为应该是什么。
Thanks
char
不保证签名或未签名(在 PowerPC Linux 上,char 默认为unsigned)。传播这个词!
你想要的是这样的宏:
#include <stdint.h> /* Needed for uint32_t and uint8_t */
#define PACK(c0, c1, c2, c3) \
(((uint32_t)(uint8_t)(c0) << 24) | \
((uint32_t)(uint8_t)(c1) << 16) | \
((uint32_t)(uint8_t)(c2) << 8) | \
((uint32_t)(uint8_t)(c3)))
它之所以丑陋,主要是因为它不能很好地适应 C 的操作顺序。另外,反斜杠返回在那里,所以这个宏不必是一大长行。
此外,我们在转换为 uint32_t 之前转换为 uint8_t 的原因是为了防止不必要的符号扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)