虽说现在大部分x86服务器都是小端字节序,但在嵌入式设备上,由于芯片种类繁多,大小端序均有。需考虑程序的可移植性。
一.字节序判断
int bigendian() { union { short value; char ubytes[ sizeof(short) ]; }test; test.value = 0x0102; if( (test.ubytes[0] == 1) && (test.ubytes[1] == 2) ) { return 1; } return 0; }
上述代码用union结构巧妙实现对字节序的判断
二.字节序转换函数
ntohs()将网络字节序转化为主机字节序
htons()将主机字节序转化为网络字节序
ntohl(),htonl()处理int类型
# if __BYTE_ORDER == __BIG_ENDIAN /* The host byte order is the same as network byte order, so these functions are all just identity. */ # define ntohl(x) (x) # define ntohs(x) (x) # define htonl(x) (x) # define htons(x) (x) # else # if __BYTE_ORDER == __LITTLE_ENDIAN # define ntohl(x) __bswap_32 (x) # define ntohs(x) __bswap_16 (x) # define htonl(x) __bswap_32 (x) # define htons(x) __bswap_16 (x) # endif # endif #endif
ntohs与htons实现一致,都是调用__bswap_32 (x)。由于大端服务器上主机序与网络序一致,不需要转换,所以实现直接返回原值x。
所以只需要考虑小端服务器上的转换,大端服务器无须理会ntohs()调用,代码本身就跨平台。
相关推荐
IP、主机字节序、网络字节序、互转 ------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using ...
利用宏将网络字节序和主机字节序ip格式化输出为字符串ip
字节序 大小端 网络编程 字节序 大小端 网络编程
对字节序的一些理解。
本地字节序和网络字节序.pdf,如题,介绍网络字节序
网络字节序与主机字节序
网络字节序 主机字节序
在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换。本篇文章着重介绍使用c++和python语言,如何实现主机...
网络中表示的IP地址与主机表示不同,本程序通过转换来表示。
判断网络字节序大小端简易程序,tcp连接监听...(Linux高性能网络编程第三版第五章源码)
网络字节序_werevj4_源码.rar
Linux 网络编程——网络字节序、地址转换,相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/45045549
本篇文章是对大端法、小端法以及网络字节序进行了详细的分析介绍,需要的朋友参考下
举例而言,有一个4字节的数据0x01020304,要存储在内存中或文件中编号0~3字节的位置,两种字节序的排列方式分别如下:Big Endian 低地址
项目中需要64位数的字节序转换,主机序转换成网路序或者相反转换,写了2个函数,有需要的可以参考。
大小端字节序的介绍和相互转换。在c++中,有4个函数可以实现主机字节序到网络字节序的相互转换。
主机字节序和网络字节序 主机字节序即内存中存储字节的方法有: 1. Little endian:将低序字节存储在起始地址 2. Big endian:将高序字节存储在起始地址 网络字序表示网络协议在处理多字节时的顺序,一律为big ...
尾数 一个小的golang库,可帮助处理主机到网络和网络到主机的字节序转换免责声明在使用此库之前,请阅读并了解Rob Pike的有关的博客文章。 长话短说,每当您需要担心代码是在小型字节序还是大型字节序计算机上运行时...
C++ 网络字节顺序转换函数、ip格式转换函数