Python 处理字节流

python处理字节的点点滴滴

python有多爽,我就不说了,反正想得到的事情,基本都有办法用python来解决,当然还有一个很重要的优点: 写python不用编译~

Context

  1. 之前毕业设计做的是SMS4的实现与安全性分析.安全性分析是什么鬼?查了查书,好像是用有特征的原文来进行测试……,具体的我也忘记了.当时就琢磨,怎么样可以做一个酷炫的安全性分析呢?
  2. 公司的新产品是一款智能硬件,它会通过TCP给服务器发送指令(当然不是熟悉的HTTP请求,是传说中的字节流)

Requirement

  1. commands+re : 这个组合可以轻轻松松的提取出命令行程序的有用信息
  2. binascii : 这个东西可以轻松的产生各种各样和二进制有关或者和ascii有关的字符串
  3. 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里面试一试就明白了