基础概念——何为大小端
首先不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址,所不同的是首先取低字节的数据存放在低地址还是取高字节数据存放在低地址。
若首先取高字节的数据存放在低地址,则是大端法;
若首先取低字节的数据存放在低地址,则是小端法;
例如有数据0x01234567 (注意:左边是高字节,右边是低字节)
大端法存放:
存放的地址依次为:0x0001 0x0002 0x0003 0x0004
对应的数据依次为:0x01 0x23 0x45 0x67
小端法存放:
存放的地址依次为:0x0001 0x0002 0x0003 0x0004
对应的数据依次为:0x67 0x45 0x23 0x01
因为我们的思维习惯是从左到右的顺序,所以大端法的存储方式符号我们思维习惯,这因为这个原因,大端法也称为网络编码。IBM的370主机,多数基于RISC计算机,和Motorola的微处理器使用big endian方法。TCP/IP也使用big endian方法(big endian方法也叫做网络编码)。因为我们的语言都是从左到右的习惯方式,所以我们希望存储字符和数字也以同样的方式出现。
数据 0x12345678 其中12是数据的高位字节,78是数据的低位字节;
内存地址 小端 大端
0x4000 0x78 0x12
0x4001 0x56 0x34
0x4002 0x34 0x56
0x4003 0x12 0x78
其实理解成高尾端和低尾端比较好;
大、小就是指开头的的数据是高位还是低位;
大端可以理解成数据的高位在内存地址的开头;
小端可以理解成数据的低位在内存地址的开头;
由于网络协议中规定字节序列都采用大端法;(网络字节序列)
但是CPU中字节序列由于厂商不同,有可能是大端法,也有可能是小端法;(主机字节序列)
这就需要进行大小端的转换;
ntohl()函数是将一个无符号长整型数从网络字节顺序转换为主机字节顺序,
同理:
htonl()函数是将长整型数从主机字节顺序转成网络字节顺序;
相关链接:
大端法还是小端法区别:https://blog.csdn.net/chudongfang2015/article/details/51305458
有关于主机字节序和网络字节序是大端字节序还是小端字节序的问题的探讨:https://blog.csdn.net/weixin_42096901/article/details/95983729
主机字节序列和网络字节序列:https://blog.csdn.net/Victor_psl/article/details/104922063