对于主机的字节序(大端、小段),在前面一篇文章“大端、小端的区别(Big-endian or Little-endian)”中已经进行了详细的介绍。由于今天了解到在C语言中联合体Union中的成员都是按照低地址开始存放,如果利用这个特性就也可以很方便写一个小程序来判断主机的字节序是大端还是小端。利用union的这个特点,判断字节序的一个小程序如下(这与我之前文章中提到的方法其实是类似的):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/* * to check the byte order of a system using a union's policy of storing its items. * author: Jay http://smilejay.cn/ * date: 2013-03-03 */ #include <stdio.h> int check_byte_order() { union myunion { int a; char b; } u; u.a = 1; if ( 1 == u.b ) return 1; else return 0; } int main(int argc, char *argv[]) { if ( check_byte_order() ) printf("This system is Little-Endian.\n"); else printf("This system is Big-Endian.\n"); } |
而网络字节顺序则是表示网络传输时的字节序,在TCP/IP协议中是按照大端(Big-Endian)传输方式,也就是高字节先走(如传输123456这个整数,是先传12,接着34,56),这跟客户端或者服务器的主机字节序都没有关系,只要确保双方在发送和接受数据时进行相应的处理即可。
C/C++中有如下四个常用的转换函数,这四个函数在小端系统中生效,大端系统由于和网络字节序相同,所以无需转换。
htons —— 把unsigned short类型从主机序转成网络字节序
ntohs —— 把unsigned short类型从网络字节序转成主机序
htonl —— 把unsigned long类型从主机序转成网络字节序
ntohl —— 把unsigned long类型从网络字节序转成主机序
使用以上函数时,需要包含相应的头文件,如下:
1 2 3 4 5 6 7 |
#if defined(linux) || defined(__linux__) #include <netinet/in.h> #endif #ifdef WIN32 #include <WINSOCK2.H> #endif |
One Comment