字节序相关问题

来源:互联网 发布:mac搜狗五笔无法使用 编辑:程序博客网 时间:2024/06/09 23:20

字节顺序 endian

计算机系统一般采用字节(Octet,8 bit )作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分字节顺序。常见的字节顺序有两种:大端Big Endian 和 小端 Little Endian。

大端序:高位字节放到内存的低地址端,低位字节排放在内存的高地址段; 小端序:低位字节存放在内存的低地址段,高位字节排放在内存的高地址段。

判断大端小段(C++):

栈地址的申请是由高到低的!!!

const int endian = 1;#define is_bigendian()  ((*(char*)&endian) == 0)#define is_littlendian()  ((*(char*)&endian) == 1)bool IsLittleEndian(){   union{   int  val;   char c;}u;   u.val = 1;   if(u.c == 1)   {//小端return true;   }   else   {//大端return false;   }}

网络字节序(Network Byte Order,NBO)

按照从高到低的顺序存储,在网路上使用统一的网络字节顺序,可以避免兼容性问题。(即为大端序,TCP/IP中使用的字节序)。

主机字节序(HBO ,Host Byte Order)

不同的机器HBO不相同,与CPU设计有关。不同机器之间通信,需要转换为网络字节序来通信。相关转换函数如下:
htonl():将主机字节顺序转化为32位网络字节顺序
ntohl():将网络字节顺序转换为32位主机字节顺序
htons():将一个16位数从主机字节顺序转化为网络字节顺序
ntohs():将一个无符号端整型数从网络字节顺序转换为主机字节顺序

inet_ntoa():将网络地址转换成"."点隔的字符串格式,返回一个字符指针
inet_addr():将IP从点数格式转换成无符号长整型(错误返回-1,与IP地址255.255.255.255相符合)

0 0