今天在读《Linux高性能服务器编程》时看到一个有趣的东西。书中用了一个特别的方法去求字节序。我们知道字节序分为大端和小端,大端就是数据的高位字节存储在内存的低地址处,小段则反之。那么我们怎么知道我们的电脑是大端还是小端呢,这本书告诉我们可以利用union的特性,union里面的变量都是共享内存的,我们只需要将一个比如int类型的数据和一个数组union在一起,赋值那个int数据,然后看看数组的高位和低位分别是什么就知道了。
int main(){
union{
short value;
char union_bytes[sizeof(short)];
}test;
test.value=0x0102;
short a=test.union_bytes[0];
cout<<a;
if(test.union_bytes[0]==1&&test.union_bytes[1]==2)cout<<"big endian"<<endl;
else if(test.union_bytes[0]==2&&test.union_bytes[1]==1)cout<<"little endian"<<endl;
else cout<<"unknown...";
}
自从知道有大端小端这个东西的时候一直有个疑问,为什么在设计上不进行统一呢。出各种各样的标准统一接口不是计算机行业的人经常做的吗哈哈哈哈哈。我给出的解释方式是或许在不同的设备功能不一样,不同的方式可以更好的适应吧。
well,既然不同了那在进行网络传输中如果不统一就会出大问题的。所以Linux给我们提供了4个函数来完成主机字节序和网络字节序的转换,现在网络字节序通常是大端。
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);