网络字节序
一.字节序
字节序是由于不同的主处理器和操作系统,对大于一个字节的变量在内存中的存放顺序不同而产生的。
字节序通常有大端字节序列和小端字节序两种分类方法。
由于主机的千差万别,主机的字节序不能做到统一,但是网络上传输的数值,它们有统一的规定。网络字节序:是指多字节变量在网络传输时的表示方法,网络字节序采用高端字节序的表示方法。
二.大端字节序和小端字节序
字节序是由于CPU和OS对多字节变量的内存存储顺序不同而产生的。
1.briefintroduce:
一个16位的整数,它由两个字节构成,在有的系统上会将高字节放在内存的低地址上,而有的系统上则将高字节放在内存的高地址上,所以存在字节序的问题。
2.字节序的表示方法有两种:
1>小端字节序(Little Endian):在表示变量的内存起始地址存放底字节,高字节顺序存放
2>大端字节序(Big Endian):在表示变量的内存起始地址存放高字节,底字节顺序存放。
3实例:
一个变量的值为0xabcd,在大端字节序和小端字节序的系统中两者的存放顺序是不同的.
1>在小端字节系统中的存放顺序如图:
0xab在地址15~8的地址上,而0xcd在地址7~0的位置上。
2>在大端字节序系统中的存放顺序如图:
4.程序实例:
可以编写程序来检测下变量在内存中的表示形式,以确定系统中的字节序为大端字节序还是小端字节序。
(1)字节序结构:
程序先建立一个公用体类型address,用于测试字节序,成员value是int 类型变量,可以通过成员byte来访问value变量的高字节和低字节。
typedef union{
unsigned intvalue;
unsigned char byte[2];
}addr;
(2)变量声明,声明一个to类型的变量typeordr,给变量value赋值为0xabcd,由于在类型addr中,value和byte成员共享同一块内存,所以可以通过byte的不同成员来访问value的高字节和低字节。
(3)程序:
int main(int argc,char *argv)
{
addr typeorder;//一个to类型的变量
typeorder.value= 0xabcd;
/*小端字节序检查*/
if(typeorder.byte[0] == 0xcd &&typeorder.byte[1]==0xab){
printf(“Low endian bye order\n”);
printf(“byte[0]:0x%x,byte[1]:0x%x\n”,typeorder.byte[0],typeorder.byte[1]);
}
/*大端字节序判断*/
if(typeorder.byte[0] == 0xab &&typeorder.byte[1]==0xcd){
printf(“High endian byte order\n”);
printf(“byte[0]:0x%x,byte[1]:0x%x\n”,typeorder.byte[0],typeorder.byte[1]);
}
return 0;
}
5.进行网络字节序转换的函数有htons,htonl,ntohs(),ntohl()等,其中s表示short数据类型,l是long数据类型的意思,h是host既主机的意思,n是network即网络的意思。
1>htons(host to net short):表示对short类型的变量,从主机字节序转换为网络字节序。
2>ntohs(net to host short):表示对short类型的变量,从网络字节序转换为主机字节序。
3>htonl(host to net long):表示对long类型的变量,从主机字节序转换为网络字节序
4>ntohl(net to host long):表示对long类型的变量,从网络字节序转换为主机字节序。
6.由于在网络中网络字节序采用高端字节序的表示方法。因此字节序转换函数在不同平台上的实现是不同的,在小端主机字节序的平台要进行转换,而在大端主机字节序的平台上是不需要进行转换的。
例如:通过下面的实现方式可以兼容不同的平台:
#if ISLE
/*小端字节序平台调用此部分代码*/
long htonl(longvalue)
{
Return ((value << 24) | ((value <<8)&0x00ff0000) |((value>>8)&0x0000ff00)|(value>>24));
}
#else if ISBE
/*大端字节序平台调用此部分代码*/
long htonl(longvalue)
{
/*由于字节序一致,不需要进行转换*/
return value;
}
#endif
分享到:
相关推荐
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格式转换函数