主机字节序与网络字节序
字节序:字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
常见的字节序有:
Little endian(小端,LE):将低序字节存储在起始地址
小端模式是最符合人的思维的字节序,地址低位存储值的低位,地址高位存储值的高位
Big endian(大端,BE):将高序字节存储在起始地址
最直观的字节序,地址低位存储值的高位,地址高位存储值的低位,不要考虑对应关系,只需要把内存地址从左到右按照由低到高的顺序写出把值按照通常的高位到低位的顺序写出,两者对照,一个字节一个字节的填充进去。
可以利用一个程序来测试系统的大小端情况,一般的原理是使用union的特性(参考我的博客共用体Union)。
测试程序如下:
#include <stdio.h>
#include <stdbool.h>
union {
int number;
char s;
} test;
/*其中 union的实际内存长度是int,即一个字,在32位机上是32位
而char是一个Byte(8位),只会取第一个低地址字节。所以它的值可以用来判断大小端*/
bool testBigEndin() {
test.number = 0x01020304;
return (test.s == 0x01);
}
int main(int argc, char **argv) {
if (testBigEndin()) {
printf("big\n");
} else {
printf("small\n");
}
return 0;
}
测试结果为:small
其实,x86系列CPU都是little-endian的字节序,而网络字节序则为大端模式的。
网络字节序:是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
在实际的网络编程中,我们常常需要使用以下4个字节序转换函数:
htons() 把unsigned short类型从主机序转换到网络序
htonl() 把unsigned long类型从主机序转换到网络序
ntohs() 把unsigned short类型从网络序转换到主机序
ntohl() 把unsigned long类型从网络序转换到主机序
本文参考博文:https://blog.csdn.net/stalin_/article/details/80337915
百度百科:https://baike.baidu.com/item/%E5%AD%97%E8%8A%82%E5%BA%8F/1457160?fr=aladdin
博客园:https://www.cnblogs.com/52php/p/6114643.html