python cookbook学习笔记十三:Struct模块

Binascii模块
通过名字很容易知道这个模块的作用,binary, ascii。两个字母的合成,也就是二进制和ascii的转换模块
下面先介绍下字母的ascii
a-zascii是从97-122. A-Zascii是从65-90,0-9ascii48-57
假设字符串为abc,那么对应的ascii码就是97,98,99,对应的十六进制则是61,62,63b2a_hex就是ascii码的16进制表示。 a
s='abc'

print binascii.b2a_hex(s)
 
E:\python2.7.11\python.exe E:/py_prj/python_cookbook.py
616263
 
 
s='abc'

ret=binascii.b2a_hex(s)

print binascii.a2b_hex(ret)
a2b_hex则会将16进制的ascii码转换成字符串
E:\python2.7.11\python.exe E:/py_prj/python_cookbook.py
abc
 
struct模块
这个模块和C语言中的struct结构基本是一个原理。如下的这个结构体,有三个字段:一个整型的type,一个字符类型的str,一个浮点数的value.
Struct
{
  int type;
  char *str;
  float value; 
}
如果我们要封装在内存中进行传输,只需要memcpy就可以实现了
那么在python中的struct模块就是起到类似的作用的。代码如下。我们同样复用上面的结构体,元组里面分别是int, string,floatStruct('I3sf')其实是表明数据的结构.这里i代表int,s代表stringf代表float。这里有3s代表3个字符
values=(1,'abc',2.7)

s=Struct('I3sf')

print s.size

packed_data=s.pack(*values)

print s.unpack(packed_data)
 
执行结果如下: size12个字节,因为intfloat分别占据4个字节,s占据一个字节,3s则是3个字节。但是从下面的运行结果来看。Size的大小是12字节,和4+3+4=11不符合。这是由于字节对齐的原则。f4个字节。起始地址需要是4的倍数。因此在3s后面填充了一个字节。因此是12个字节。
E:\python2.7.11\python.exe E:/py_prj/python_cookbook.py
12
(1, 'abc', 2.700000047683716)
 
如果改成s=Struct('if3s')。这样就不存在字节对齐的原则,因此大小就是11字节。

格式字符的意义以及大小参加下表




从上面的例子可以看到packunpack分别是打包和解包的功能。如果在struct中设置的包格式不对,解包的时候会如何呢。比如代码改成如下,structif3s,也就是整数,浮点数,字符
values=(1,'abc',2.7)

s=Struct('if3s')

print s.size

packed_data=s.pack(*values)

print s.unpack(packed_data)
会报下面的错误,提示解析到第二个数也就是abc的时候不是一个浮点数。因此struct中格式的顺序一定要准确。
Traceback (most recent call last):
  File "E:/py_prj/python_cookbook.py", line 297, in <module>
    packed_data=s.pack(*values)
struct.error: required argument is not a float
如果代码继续改成如下的形式,isf。也就是中间只有1个字符
values=(1,'abc',2.7)

s=Struct('isf')

print s.size

packed_data=s.pack(*values)

print s.unpack(packed_data)
结果如下,可以看到只有a被解析出来了,因为格式中只有1个字节。因此只解析了一个字节的数据。
E:\python2.7.11\python.exe E:/py_prj/python_cookbook.py
12
(1, 'a', 2.700000047683716)
 
另外补充一点对于底层来说,字节的顺序分为大端序(高端在前)和小端序(低端在前)Struct('<isf')代表小端序,Struct('>isf')代表大端序。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿与代码

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值