首页 > 编程语言 >Python Struct 处理网络字节流

Python Struct 处理网络字节流

时间:2023-02-25 17:35:51浏览次数:57  
标签:conversion struct Python 字节 x00 data final Struct

背景

  • 因为websocket请求/返回均需要处理字节流
  • 现返回基本能正常处理,但请求字段及加密方式与业务紧密相关,抓着开发大佬问了几遍,有点头疼

 

Python 中的 struct 模块

pack 操作

  • Pack 操作必须接受一个 template string 以及需要进行 pack 一组数据,这就意味着 pack 处理操作 定长 的数据
import struct

a = struct.pack("2I3sI", 12, 34, b"abc", 56)
print('a:',a)
 
#输出
a: b'\x0c\x00\x00\x00"\x00\x00\x00abc\x008\x00\x00\x00'

 

unpack 操作

  • 对于 unpack 而言,需要 fmt 对应的字节数和字节字符串 string 的字节数一致,就可以成功的进行解析,否则 unpack 函数将抛出异常。
import struct
import binascii

packed_data = binascii.unhexlify(b'0100000061620000cdcc2c40')

s = struct.Struct('I 2s f')
unpacked_data = s.unpack(packed_data)
print('Unpacked Values:', unpacked_data)

 

计算字节大小

print struct.calcsize("2I3sI") # 16

 

Python pack 操作支持的数据类型

 

实际处理demo(需要先处理数据长度):

import struct

###打开文件
f = open('/Users/mac_bigsur/Downloads/test_data_0x7414_12251', 'rb')

###读固定前20个字节
packed_data20 = f.read(20)
print(packed_data20)

###设置解析格式并解析
s20= struct.Struct('B B B B H H I I I')
unpacked_data20 = s20.unpack(packed_data20)
print('Unpacked Values:', unpacked_data20)


###拿到数据长度
data_len = unpacked_data20[8]
print(data_len)

###设置数据解析格式并解析
data_s = struct.Struct(str(int(data_len/4))+"I")
packed_data = f.read()
data = data_s.unpack(packed_data)
print('data',data)
  • header为固定前20个字节,第9个组为body长度
  • 拿到body字节长度计算后,再解析body

 

对应JAVA实现:

PacketByteConversion conversion = new PacketByteConversion(data);
try {
    final byte flag = conversion.readByte();
    final byte version = conversion.readByte();
    final byte keyType = conversion.readByte();
    final byte reserved = conversion.readByte();
    final short cmdID = conversion.readShort();
    final short seq = conversion.readShort();
    final int fromID = conversion.readInt();
    final int toID = conversion.readInt();
    final byte unzip = 1;
    int dataLen = conversion.readInt();
    byte[] dataBuf = conversion.readData(dataLen);
    String cmd = String.format("0x%x", cmdID);
    }

 

参考:

https://pymotw.com/3/struct/index.html
https://blog.csdn.net/qq_37674086/article/details/118914471

标签:conversion,struct,Python,字节,x00,data,final,Struct
From: https://www.cnblogs.com/QingshanY/p/17154839.html

相关文章

  • 用Python绘图(数据分析与挖掘实战)
    代码1:餐饮日销额数据异常值检测(箱型图)importpandasaspdimportnumpyasnpcatering_sale="D:\\360MoveData\\Users\\86130\\Documents\\TencentFiles\\226875669......
  • python笔记--在文件进行输出
    将print的内容输出到文件中1#将数据输出到文件中2fp=open('E:/text1.txt','a+')3print('helloword',file=fp)4fp.close()  1#不进行换行输出(在一行输出......
  • 2023.8 Java与Python
    Java与Python都一直在各种流行编程语言中名列前茅,也有很多相似之处。作为技术人员,我们不能把自己局限在某一项技术或编程语言中,而应该能针对具体场景快速选择适合的技术解......
  • Python 部署私有 pip 库
    Python部署私有pip库本教程使用的是pypiserver这个Python包,其文档见:https://pypi.org/project/pypiserver/,Github地址:https://github.com/pypiserver/pypiserver......
  • Python学习笔记(五)if分支语句
    一、if语法示例:1money=int(input('请输入余额:'))2ifmoney>=5:3print('买得起!')45ifTrue:6print('条件成立时要执行的代码1')7print('条......
  • python的驻留机制
    在某些情况下,python会使用现有的不可变对象,而不是总是创建一个新对象。驻留的对象在内部使用类似字典的结构(驻留池)进行驻留,节省内存。原理:系统维护interned字典类型记录已......
  • fatal error: Python.h: No such file or directory
    fatalerror:Python.h:Nosuchfileordirectory过程:通过pipinstall某个库,发生了一下错误,找不到Python.h的头文件解决方案搜索StackoverFlow,我的环境是CentOS,所以执......
  • 强行在CentOS上kill python进程 unix:///tmp/supervisor.sock
    问题:unix:///tmp/supervisor.sock解决方案:echo_supervisord_conf>/etc/supervisord.confsudosupervisord-c/etc/supervisord.confsudosupervisorctlstatus​​https:......
  • 解决Python Tornado的某个页面不需要进行xsrf的检查
    错误信息:‘_xsrf’argumentmissingfrompost我们总是对全站开启xsrf的功能,但是有时候想对单个页面不希望启用该功能的验证,那么我们可以进行重写​​check_xsrf_cookie()......
  • Python3的AES加密和解密
    此加密和解密的秘钥的长度必须是16位、24位或者32位importbase64importosfromCrypto.CipherimportAES#AESkeymustbeeither16,24,or32byteslongaes_key="1......