pickle序列化
pickle 腌制
pickle.load(file)
pickle.dump(file)
pickle.dumps(str)
pickle.loads(str)
-----------------
import pickle
#dumps(obj) 将对象序列化
lista=["one","tow","three"]
listb = pickle.dumps(lista)
#print listb
#loads(str) 将原对象恢复,数据类型也恢复原来的
listc = pickle.loads(listb)
#print listc
#-------
#dump(obj,file) 将对象存储到文件里序列化
str = ("str1","str2","str3")
fl=file('1.file','wb') #文件名1.file write模式
pickle.dump(str,fl,True)
fl.close()
#load(obj,file) 将dump()存储在文件的数据恢复
f2=file('1.file','rb')
t=pickle.load(f2)
#print t
f2.close()
struct 字节流,组包拆包实现
http://blog.sina.com.cn/s/blog_4b5039210100f1tu.html
http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html
struct.pack()
struct.unpack()
>>> import struct
>>> a=20
>>> b=400
>>> str=struct.pack('ii',a,b) #转换成字节流,虽然还是字符串,但是可以在网络上传输
>>> print len(str) #ii 表示两个int
8 #可以看到长度为8个字节,正好是两个int型数据的长度
>>> a1,a2=struct.unpack('ii',str)
>>> print ("a1:%d , b2:%d"%(a1,b1)) #a1:20,b2:400
>>> a='abc'
>>> print(a)
>>> bytes=struct.pack('3s',a)
>>> a,=struct.unpack('3s',bytes)
>>> print(a)
format = "!HH%ds" % len(data)
buffer = struct.pack(format,opcode,blocknumber,data)
我们要对一个数据进行打包,加上一些个包头,我们根据下面的格式符信息,知道H是unsigned short是2个字节,而s是char型。所以这个buffer就是2个字节的opcode,2个字节的blocknumber,和len长的char。
Socket程序中的ntohs, ntohl, htons,htonl
socket.ntohs=net to host short int 16位
socket.htons=host to net short int 16位
socket.ntohl =net to host long int 32位
socket.htonl=host to net long int 32位
struct中支持的格式如下表:
Format | C Type | Python | 字节数 |
---|---|---|---|
x | pad byte | no value | 1 |
c | char | string of length 1 | 1 |
b | signed char | integer | 1 |
B | unsigned char | integer | 1 |
? | _Bool | bool | 1 |
h | short | integer | 2 |
H | unsigned short | integer | 2 |
i | int | integer | 4 |
I | unsigned int | integer or long | 4 |
l | long | integer | 4 |
L | unsigned long | long | 4 |
q | long long | long | 8 |
Q | unsigned long long | long | 8 |
f | float | float | 4 |
d | double | float | 8 |
s | char[] | string | 1 |
p | char[] | string | 1 |
P | void * | long |
注1.q和Q只在机器支持64位操作时有意思