网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确地解释。
所有的网络协议都是采用大端(big endian)方式来传输数据的,因此,有时也将big endian方式称为网络字节序。
htons:将unsigned short类型从主机字节序转换到网络字节序。
htonl:将unsigned long类型从主机字节序转换到网络字节序。
ntohs:将unsigned short类型从网络字节序转换到主机字节序。
ntohl:将unsigned long类型从网络字节序转换到主机字节序。
注:在使用little endiand的机器中,这些函数会按照对应的规则进行转换;在使用big endian的机器中,这些函数会成为空宏。
Big-Endian和Little-Endian的定义如下:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 ----------------->
项目中才知道TCP、UDP通信的字节集合要求是Big Edian而计算机的处理可能是Little Edian 导致问题。
1、关于Big或Little Edian字节顺序的具体解释
字节顺序 Endian
现代的计算机系统一般采用字节(Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分字节顺序(Byte Order, orEndianness)。常
一.将双字节转成2个单字节,eg:0x1100-->0x11和0x00
#define HI_UINT16(a) (((a) >> 8) & 0xFF)
#define LO_UINT16(a) ((a) & 0xFF)二.判断是大端模式还是小端模式int...
1.故事的起源
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
2.什么是Big Endian
字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序。
在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如:如果C/C++中的一个int型变量 a 的起始地址是&a = 0x100,那么 a 的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。
根据整数 a 在连续的 4 byte 内存中的存储顺序,字节序被分为大端序(Big Endian) 与 小端序(Little Endian)两类。 然后就牵涉出两大CPU派系:
Motorola
大端(Big Endian)和小端(Little Endian)的区别
在C/C++中,我们经常会处理位运算。不同的系统字节的排列就不一样,有的系统是大端排列,有的系统是小端排列。因此,处理位运算也会因不同的系统而不一样。下面我来介绍一下大端(Big Endian)和小端(Little Endian)的区别。