Python网络字节序和主机字节序
struct的pack方法实现了字节流,那么这里就牵涉到一个字节流的字节序问题,当一个16位的int型数据形成01的字节流时,是高位在前,还是低位在前?这里分为网络字节序,和主机字节序。
Little endian:将低序字节存储在起始地址
Big endian:将高序字节存储在起始地址
LE little-endian :
BE big-endian
只需要把内存地址从左到右按照由低到高的顺序写出,把值按照通常的高位到低位的顺序写出 两者对照,一个字节一个字节的填充进去
例子:在内存中双字0x01020304(DWORD)的存储方式
内存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04
例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
0x0000
0x0001
0x0002
0x0003
x86系列CPU都是little-endian的字节序.
我们用python来试验一下:
>>> from struct import *
>>> pack('@h',14)
'\x0e\x00'
>>>
在struct的pack打包中,提供了一个’!’,来实现网络字节序,比如同样是上面的例子:
>>> from struct import *
>>> pack('!h',14)
'\x00\x0e'
>>>
Server端:
import socket
import struct
BUFSIZ=1024
ADDR=('localhost',2046)
recvsocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
recvsocket.close()
import socket
import struct
BUFSIZ=1024
ADDR=('localhost',2046)
sendsocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
data=struct.pack('!h',14)
print repr(data)
sendsocket.sendto(data,ADDR)
sendsocket.close()
client端往server端发一个14,int
1、网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
处理器
Alpha
HP-PA
HP-PA
Intelx86
Motorola680x()
MIPS
MIPS
PowerPC
PowerPC
RS/6000
SPARC
IXP1200 ARM核心