储备知识点: 1. unsigned 无符号
signed有符号
eg : signed int : -128---127
unsigned int : 0 --- 255 、
2.binascii模块:
字节流和ascii转换 s = b'hello' b = binascii.hexlify(s) print(b) #结果就是用引号括起来的ascii值 ----------- print(binascii.unhexlify(b)) #结果就是b'hello'
3.ctypes模块
values
=
(
1
,
'abc'
,
2.7
)
s
=
struct.Struct(
'I3sf'
)
prebuffer
=
ctypes.create_string_buffer(s.size) #创建一个s.size大小的字节缓冲区
print
'Before :'
,binascii.hexlify(prebuffer)
s.pack_into(prebuffer,
0
,
*
values) #从缓冲区0位置处,放入values数据
print
'After pack:'
,binascii.hexlify(prebuffer)
unpacked
=
s.unpack_from(prebuffer,
0
)
print
'After unpack:'
,unpacked
输出:
Before : 000000000000000000000000 #缓冲区没值,hexlify(缓冲区),值就为0000000...000After pack: 0100000061626300cdcc2c40 #缓冲区放入值之后,缓冲区的ascii值
After unpack: (1, 'abc', 2.700000047683716)
#如果要多多个对象打包和解包就可以如下操作
values1
=
(
1
,
'abc'
,
2.7
)
values2
=
(
'defg'
,
101
)
s1
=
struct.Struct(
'I3sf'
)
s2
=
struct.Struct(
'4sI'
)
prebuffer
=
ctypes.create_string_buffer(s1.size
+
s2.size)
print
'Before :'
,binascii.hexlify(prebuffer)
s1.pack_into(prebuffer,
0
,
*
values1)
s2.pack_into(prebuffer,s1.size,
*
values2)
print
'After pack:'
,binascii.hexlify(prebuffer)
print
s1.unpack_from(prebuffer,
0
)
print
s2.unpack_from(prebuffer,s1.size)
#功能:使用struct模块进行(字节流---元祖)之间的打包和拆包
#字节流:网络上传输格式
import struct
name = b'lily'
age = 18
sex = b'female'
job = b'teacher'
pack_content = struct.pack('4si6s7s',name,age,sex,job)
>>>pack_content
>>>b'lily\x12\x00\x00\x00femaleteacher'
>>>struct.unpack('4si6s7s',pack_content) >>>(b'lily', 18, b'female', b'teacher')
补充:
上面提到的pack方法都是对输入数据进行操作后重新创建了一个内存空间用于返回,也就是说我们每次pack都会在内存中分配出相应的内存资源,这有时是一种很大的性能浪费。struct模块还提供了pack_into() 和 unpack_from()的方法用来解决这样的问题,也就是对一个已经提前分配好的buffer进行字节的填充,而不会每次都产生一个新对象对字节进行存储