当用int32联合char [4]时克服小尾数

时间:2012-10-26 18:22:34

标签: c endianness unions

在我的小端z80-esque处理器上,我有一个32位long int msk = 0xFFFFFF00(子网掩码)。 今天早上,当我尝试过去的时候,我学会了关于endian-ness的知识 (unsigned char *)&mskvoid bar(unsigned char * c);函数遍历此&msk的值并将它们存储到数据库中。

不幸的是,由于z80处理器的小端,数据库将值“向后”存储,当另一个函数读回字节时,它会看到0x00FFFFFF,这不是正确的子网掩码。

这对工会有什么微不足道的方法吗?我希望char[3]映射到long int msk的LSB,而不是当前的(char[0]获取LSB)。

总之,Big-Endian更好。

2 个答案:

答案 0 :(得分:2)

修复字节序问题:无论何时将整数序列化到磁盘或网络,都要将它们转换为已知的字节顺序。网络命令又名big-endian,是最简单的,因为htonl和htons函数已经存在。或者您可以通过使用byte & 0xFF; byte >>= 8或带有((byte >> i*8) & 0xFF)的高位字节重复拉出低位字节来手动执行此操作

如果你有一个long int值并想要它的LSB,那么使用位移和掩码操作而不是联合或强制转换就更容易了。

答案 1 :(得分:1)

ntohl将交换32位整数的字节序