在我的小端z80-esque处理器上,我有一个32位long int msk = 0xFFFFFF00
(子网掩码)。
今天早上,当我尝试过去的时候,我学会了关于endian-ness的知识
(unsigned char *)&msk
到
void bar(unsigned char * c);
函数遍历此&msk
的值并将它们存储到数据库中。
不幸的是,由于z80处理器的小端,数据库将值“向后”存储,当另一个函数读回字节时,它会看到0x00FFFFFF
,这不是正确的子网掩码。
这对工会有什么微不足道的方法吗?我希望char[3]
映射到long int msk
的LSB,而不是当前的(char[0]
获取LSB)。
总之,Big-Endian更好。
答案 0 :(得分:2)
修复字节序问题:无论何时将整数序列化到磁盘或网络,都要将它们转换为已知的字节顺序。网络命令又名big-endian,是最简单的,因为htonl和htons函数已经存在。或者您可以通过使用byte & 0xFF; byte >>= 8
或带有((byte >> i*8) & 0xFF)
的高位字节重复拉出低位字节来手动执行此操作
如果你有一个long int
值并想要它的LSB,那么使用位移和掩码操作而不是联合或强制转换就更容易了。
答案 1 :(得分:1)
ntohl
将交换32位整数的字节序