我在python中解压缩功能有问题

问题描述

对不起,因为我的英语水平不好。

我想用python解压缩来解码somme二进制消息。但我有问题

一个消息看起来像这样

from struct import *
firstMessage = b'\x00\x00\x00\x00\xff\xff\xff\x00' #without tags
decodeFirstMessage = unpack('1q',firstMessage)
print(decodeFirstMessage[0])

第二条消息是这样的

from struct import *
secondMessage = b'*xxyyzz \x03 \x00\x00\x00\x00\xff\xff\xff\x00 tago1;' #with tags
decodeSecondMessage = unpack('7s1s1B1sq1s6s',firstMessage)
print(decodeSecondMessage [0])

我得到的第一个代码

72057589742960640

作为答案。

我得到的第二个代码

解压缩需要31个字节的缓冲区

作为答案。

我试图用此代码在解压缩函数中验证format的值

print(calcsize('1q'))
print(calcsize('7s1s1B1sq1s6s'))

我得到:

8

31

我自己计算了字节并得到了

8

25

当我用“格式”中的b或h更改q时,我用calcsize()获得正确的18字节或19字节的值

但是对于l和q我有问题

请问我的功能有什么问题或如何解决

解决方法

这样做的原因是填充。

阅读整个文档部分Byte Order,Size,and Alignment

一个例子:

>>> print(calcsize('1s1q'))
16
>>> print(calcsize('=1s1q'))
9
,

简短版本是,请改用此格式:

"=7s1s1B1s1q1s6s"

较长的版本是alignment。当使用默认@时,“字节顺序”,“大小”和“对齐”的意思是“本机”。解释格式以匹配平台上相应C struct的布局。使用=格式可切换为标准尺寸并对齐。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...