Python网络字节序与主机字节序

这几天一直在看Python网络编程的相关书籍,看到网络字节序与主机字节序时有些不是很明白,所以从网上找了好多文章去理解,里面有些内容参考了其他博主的文章,我会在最后注明转载地址。当然,上机操作与理解是最重要的,我将我的上机操作结果截图放在了文章里。(操作环境:ubuntu 16.04/python 2.7.12)

第一次写博文,若有不足望各位大佬指出,谢谢。

1.LE和BE

 LE(Little Endian):将低序字节存储在起始位置,即地址低位存储值的低位,地址高位存储值的高位。 (符合人的思维的字节序)
BE(Big Endian):将高序字节存储在起始位置,即地址高位存储值的低位,地址低位存储值的高位。 (直观的字节序)

2.e.g.(2个例子)

(在内存中0x01020304的存储方式)
内存地址    4001    4001    4002    4003
LE                    04        03          02       01
BE                    01        02          03       04
(将0x1234abcd写入以0x0000开始的内存中)
                     LE               BE
0x0000    0xcd           0x12
0x0001    0xab           0x34
0x0002    0x34           0xab
0x0003    0x12           0xcd

3.网络字节序(NBO,Network Byte Order)与主机字节序(HBO,Host Byte Order)

   <1>x86系列CPU都是LE的字节序

        看个例子:

        

          int型的整数14用二进制表示应该是00000000 00000000 00000000 00001110,

          十六进制的表示应该是0x00 0x00 0x00 0x0e,但我们的主机是按LE存储的,即

          0x0e 0x00 0x00 0x00。

    <2>网络字节序是TCP/IP规定好的一种数据表示格式,它与具体的CPU类型、操作系统无关,从而保证数据在不同主机之间传输时能够被正确解释,它采用BE字节序。

           看个例子:

         

       (struct的pack打包中提供了一个“!” 来实现网络字节序)

       「关于struct.pack与struct.unpack函数的使用在最后会有说明」

4.Python中的htons(),htonl(),ntohs(),ntohl()函数

htons()--Host to Network Short(将16位正整数从主机字节序转换为网络字节序)
htonl()--Host to Network Long(将32位正整数从主机字节序转换为网络字节序)
ntohs()--Network to Host Short(将16位正整数从网络字节序转换为主机字节序)
ntohl()--Network to Host Long(将16位正整数从网络字节序转换为主机字节序)

看个例子:


解释:123的16进制表示是0x00\0x00\0x07\0x0b,而2063597568的16进制表示是0x0b\0x07\0x00\0x00。

5.Python的struct.pack()与struct.unpack()函数

 关于这两个函数的详细用法可以参考(转载自PHP中文网,我觉得写的很详细):

  http://m.php.cn/article/356984.html

 e.g.:

 

i(integer,4bytes,32 bits)

h(short,2bytes,16 bits)

b(signedchar,1 bytes, 8bits)


参考博文:

http://blog.sina.com.cn/s/blog_4b5039210100f2a0.html


猜你喜欢

转载自blog.csdn.net/qq_35075164/article/details/80917727
今日推荐