Python 处理字节流
python处理字节的点点滴滴
python有多爽,我就不说了,反正想得到的事情,基本都有办法用python来解决,当然还有一个很重要的优点: 写python不用编译~
Context
- 之前毕业设计做的是
SMS4的实现与安全性分析
.安全性分析是什么鬼?查了查书,好像是用有特征的原文来进行测试……,具体的我也忘记了.当时就琢磨,怎么样可以做一个酷炫的安全性分析呢? - 公司的新产品是一款智能硬件,它会通过
TCP
给服务器发送指令(当然不是熟悉的HTTP请求,是传说中的字节流)
Requirement
- commands+re : 这个组合可以轻轻松松的提取出命令行程序的有用信息
- binascii : 这个东西可以轻松的产生各种各样和二进制有关或者和ascii有关的字符串
- struct : 超级牛逼的解包模块,瞬间把一个字节流解成元组
OK, Let’s go
commands+re
commands.output(cmd),cmd是shell命令我也不知道windows的命令可以不可以~~
这一条可以把运行结果返回出来(字符串形式)
然后用re来做正则匹配,再搭配一些split(),replace()之类的操作字符串的函数,就可以提取出一个命令行程序中有用的信息了.
binascii
binascii.b2a_hex(data)
binascii.hexlify(data)
data
就是原始字符串,假设就是”abcde”
返回的也是字符串,不过是16进制的字符串”6162636465”
binascii.a2b_hex(hexstr)
binascii.unhexlify(hexstr)
这个函数就是反过来的
‘hexstr’是16进制的字符串,假定说是”6162636465”
返回的字符串就是他们所对应的ascii的字符,就是”abcde”
这有啥用嘞?
做测试!
让下位机发送一条指令可能还蛮复杂的,或者蛮浪费资源什么的,这样调试服务器代价会比较大.使用binascii来制作测试数据再好不过了.
假设下位机发送的数据是”0xaa,0xbb,0xcc,0x12,0x34,0xdd,0xee,0xff”
我们就可以模拟一条
a="aabbcc1234ddeeff"
b=asciibin.a2b_hex(a)
b就是模拟了服务器收到socket字节流.真方便
struct
收到字节流,根据协议,得知其中的8个字节是double,4个字节是float.
嗯,字节转整形还是有办法的,那么转成浮点型应该怎么转呢??
import struct吧
将python数据封装成字节流
struct.pack(format,argvs...)
将字节流解析成python数据类型
struct.unpack(format,string)
format
很有意思,简单说就是解析规则.
比如解析成float,就写’f’
解析成double,就写成’d’
那么一个数据流里面既有float又有double怎么办呢?
嗯,截取字符串嘛!
struct.unpack('f',s1[0:4])
struct.unpack('d',s1[4:12])
哈哈,我一开始也是这样写的,后面章鱼兄跟我说,format里面可以写很多东西
struct.unpack('fd',s1)
这个会直接返回(r1,r2),其中r1就是那个float,r2就是那个double
真的好方便
附表一张
format | 类型 |
---|---|
f | float |
d | double |
c | char |
i | int |
l | long |
3s | 长度为3的字符串 |
4s | 长度为4的字符串 |
5s | 长度为5的字符串 |
… | … |
至于struct.pack()嘛,既然format都有了,那么应该不难理解了,在python里面试一试就明白了