Python中的解包格式字符

Python中的解包格式字符,python,perl,unpack,Python,Perl,Unpack,我需要这个Perl字符串的Python模拟: unpack("nNccH*", string_val) 我需要Python格式字符的nNccH*-数据格式 在Perl中,它将二进制数据解压为五个变量: “网络”中的16位值(大端) “网络”中的32位值(大端) 有符号字符(8位整数)值 有符号字符(8位整数)值 十六进制字符串,高位半字节优先 但是我不能用Python来做 更多: 我从未用Perl或Python编写过,但我当前的任务是编写一个用Perl编写的多线程Python服务器…您正在

我需要这个Perl字符串的Python模拟:

unpack("nNccH*", string_val)
我需要Python格式字符的
nNccH*
-数据格式

在Perl中,它将二进制数据解压为五个变量:

  • “网络”中的16位值(大端)
  • “网络”中的32位值(大端)
  • 有符号字符(8位整数)值
  • 有符号字符(8位整数)值
  • 十六进制字符串,高位半字节优先
但是我不能用Python来做

更多:


我从未用Perl或Python编写过,但我当前的任务是编写一个用Perl编写的多线程Python服务器…

您正在寻找的等效Python函数是
struct.unpack
。格式字符串的文档如下所示:

如果你真的解释你需要什么样的解包,你会有更好的机会得到帮助。不是每个人都知道Perl。

Perl格式
“nNcc”
相当于Python格式
“!HLbb”
。 Python中没有直接等效于Perl的
“H*”

有两个问题

  • Python的
    struct.unpack
    不接受通配符,
    *
  • Python的
    struct.unpack
    没有“hexlify”数据字符串
第一个问题可以使用像
unpack
这样的帮助函数来解决

第二个问题可以使用binascii.hexlify解决:

导入结构
导入binascii
def拆包(fmt,数据):
"""
返回结构解包(fmt,数据),fmt中的可选单*替换为
给定数据长度的适当数字。
"""
# http://stackoverflow.com/a/7867892/190597
尝试:
返回结构解包(fmt,数据)
除了struct.error:
flen=struct.calcsize(fmt.replace('*','')
alen=len(数据)
idx=fmt.find('*'))
前字符=fmt[idx-1]
n=(alen-flen)//struct.calcsize(在字符之前)+1
fmt=''.join((fmt[:idx-1],str(n),在_char之前,fmt[idx+1:]))
返回结构解包(fmt,数据)
数据=打开('data')。读取()
x=列表(解包(“!HLbbs*”,数据))
#x[-1].encode('hex')在Python2中工作,但在Python3中不工作
x[-1]=binascii.hexlify(x[-1])
打印(x)
在使用此Perl脚本生成的数据进行测试时:

$line = pack("nNccH*", 1, 2, 10, 4, '1fba');
print "$line";
Python脚本产生

[1, 2, 10, 4, '1fba']

谢谢我已经阅读了perl和python解包文档。但到目前为止,我有些时候还不明白。@Eli-直接翻译可能会有小麻烦。例如,在python中如何执行H*?我想,用户本可以用更好的措辞回答这个问题。@SenthilKumaran:注意,用户在我的回答之后编辑了这个问题。在编辑之前,他没有列出格式字符的含义Perl@SirD:“到目前为止,有些时刻我还不明白。”。请具体说明您不了解的内容。请更新问题以说明您不理解的内容。我可以找到除H*之外的所有内容的等效项,我假设您将使用p或s。您需要计算字符串大小,此答案可能会有所帮助<代码>“而DataByte=client[0]。recv(1):”不是Python。这是行不通的。@SenthilKumaran:AFAIR
*
的意思是“剩下的元素尽可能多”,所以他可以在
H*
之前解包所有的东西,然后不解包就把剩下的拿出来。顺便说一句,D先生,谢谢你编辑和澄清这个问题。最后一段代码没有什么意义,正如S.Lott所注意到的,
binascii.hexlify()的一个替代方案是
str.encode(“hex”)
。如果您想与Python 3兼容,在计算
n
时需要
/
,否则
str(n)
会生成“16.0”并破坏格式字符串。在Python 3.4及更新版本中,有
struct.iter\u unpack
。这是一次示威。
[1, 2, 10, 4, '1fba']