在Python中解压格式字符

2024-10-03 00:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

unpack("nNccH*", string_val)

我需要使用Python格式字符的nNccH*-data格式。在

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

  • “网络”中的16位值(big-endian)
  • “网络”中的32位值(big-endian)
  • 带符号字符(8位整数)值
  • 带符号字符(8位整数)值
  • 十六进制字符串,先高位半字节

但我不能用Python来做

更多:

^{pr2}$

我从来没有用Perl或Python编写过,但我当前的任务是编写一个用Perl编写的多线程Python服务器。。。在


Tags: 字符串网络datastring格式整数val字符
2条回答

您要寻找的等效Python函数是struct.unpack。格式字符串的文档如下:http://docs.python.org/library/struct.html

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

Perl格式"nNcc"相当于Python格式"!HLbb"。 Python中没有Perl的"H*"的直接等价物。在

有两个问题。在

  • Python的struct.unpack不接受通配符*
  • Python的struct.unpack不是“hexlify”数据字符串

第一个问题可以使用类似于unpack的助手函数来解决。在

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

import struct
import binascii

def unpack(fmt, data):
    """
    Return struct.unpack(fmt, data) with the optional single * in fmt replaced with
    the appropriate number, given the length of data.
    """
    # http://stackoverflow.com/a/7867892/190597
    try:
        return struct.unpack(fmt, data)
    except struct.error:
        flen = struct.calcsize(fmt.replace('*', ''))
        alen = len(data)
        idx = fmt.find('*')
        before_char = fmt[idx-1]
        n = (alen-flen)//struct.calcsize(before_char)+1
        fmt = ''.join((fmt[:idx-1], str(n), before_char, fmt[idx+1:]))
        return struct.unpack(fmt, data)

data = open('data').read()
x = list(unpack("!HLbbs*", data))
# x[-1].encode('hex') works in Python 2, but not in Python 3
x[-1] = binascii.hexlify(x[-1])
print(x)

在测试此Perl脚本生成的数据时:

^{pr2}$

Python脚本生成

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

相关问题 更多 >