字节序相关--本地字节序和网络字节序等

1、本地字节序
        由于不同的计算机系统采用不同的字节序存储数据,同样一个4字节的32位整数,在内存中存储的方式就不同。 字节序分为小尾字节序/小端字节序(Little Endian)大尾字节序/大端字节序(Big Endian)
        Intel处理器大多数使用小尾字节序,Motorola处理器大多数使用大尾(Big Endian)字节序。
        小尾/小端就是低位字节排放在内存的低端,高位字节排放在内存的高端。例如一个4字节的值为0x1234567的整数与高低字节对应关系:

将在内存中按照如下顺序排放:
字节序相关--本地字节序和网络字节序等_第1张图片
 
       大尾/大端就是高位字节排放在内存的低端,低位字节排放在内存的高端。例如一个4字节的值为0x1234567的整数与高低字节对应关系:

将在内存中按照如下顺序排放:
字节序相关--本地字节序和网络字节序等_第2张图片

        常见CPU与本地字节序对照表

字节序相关--本地字节序和网络字节序等_第3张图片

2、网络字节序
        TCP/IP 各层协议将字节序定义为大尾/大端,因此TCP/IP协议中使用的字节序通常称之为网络字节序

3、字串在内存中的存储(intel系列)
       字串和整数是相反的,是按字串的索引从低到高存储到内存中的;
char s[4] =
“abc”; 


将在内存中按照如下顺序排放:
字节序相关--本地字节序和网络字节序等_第4张图片

4、整数数组在内存中的存储(intel系列)
        同字串一样,但是数组里的每一个整数的存储是按照小尾字节序;
 
5linux系统中的处理方法
        网络字节序作为一个标准字节序,如果系统并没有提供相关的转换函数,我们可以通过以下4个宏实现本地字节序和网络字节序的相互转换:
       htons(): 将16位无符号整数从本地字节序转换成网络字节序
       htonl(): 将32位无符号整数从本地字节序转换成网络字节序
       ntohs(): 将16位无符号整数从网络字节序转换成本地字节序
        ntohl(): 将32位无符号整数从网络字节序转换成本地字节序

6、测试程序  待自己写
int main(void)
{
    char s[4] = "abc";
    char *p = s; 
    printf("%02x,%02x,   %02x,   %02x\n", &s[0], &s[1],&s[2], &s[3]);
    printf("%02x,%02x,   %02x,   %02x\n", p, p+1, p+2, p+3);
    printf("%c,  %c, %c, %c\n", s[0], s[1], s[2],s[3]);
        
    return 0;
}
输出结果:
[netcool@HFINMSP2 demo]$./demo001
bffeadf4,      bffeadf5,      bffeadf6,      bffeadf7
bffeadf4,      bffeadf5,      bffeadf6,      bffeadf7
a,     b,     c,


整理自:http://blog.sina.com.cn/s/blog_4c8b12b90100hjww.html
相关博文:http://blog.163.com/holy_1017/blog/static/166851052201221984033698/

字节序相关--本地字节序和网络字节序等_第5张图片

你可能感兴趣的:(字节序相关--本地字节序和网络字节序等)