Python结构Unp

2024-05-15 00:26:19 发布

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

我有一个小问题困扰了我一个小时左右。

string = b'-'
t = struct.pack(">h%ds" % len(string), len(string), string)
print(t)

此包的结果是b'\x00\x01-'

我遇到的问题是,我不知道如何解包结果b'\x00\x01-'以便它只是'-',是的。我知道我可以把前面的垃圾去掉,但事情会复杂一点。我试着简化一下。希望有人能帮助我。:)


Tags: stringlends事情structpack垃圾print
3条回答

通常不会使用struct.pack将长度头和值放在一起。相反,您只需执行struct.pack(">h", len(data)),通过线路发送(例如在网络协议中),然后发送数据。不需要创建新的字节缓冲区。

在您的情况下,您可以简单地执行以下操作:

dataLength, = struct.unpack(">h", t[:2])
data = t[2:2+dataLength]

但正如我所说,如果你有一个基于套接字的应用程序,它会是这样的:

header = receive(2)
dataLength, = struct.unpack(">h", header)
data = receive(dataLength)

假设data是一个很大的字节块,您已经成功地解析出了第一个posn字节。这个字节块的文档表明,下一项是一个字节字符串,前面是一个16位有符号(不太可能,但您确实说过h格式)的bigendian整数。下面是要做的:

nbytes, = struct.unpack('>h', data[posn:posn+2]
posn += 2
the_string = data[posn:posn+nbytes]
posn += nbytes

现在你已经为下一个项目做好了准备。

注意:如果您编写的代码仅限于Python2.5或更高版本,则可以使用unpack_from()

import struct
string = b'-'
fmt=">h%ds" % len(string)

在这里,您将包装长度和字符串:

t = struct.pack(fmt, len(string), string)
print(repr(t))
# '\x00\x01-'

因此,解包时,您应该希望返回两个值,即长度和字符串:

length,string2=struct.unpack(fmt,t)
print(repr(string2))
# '-'

一般来说,如果您不知道字符串是如何打包的,那么就没有可靠的fire方法来恢复数据。你只要猜就行了!

如果你知道数据 由字符串的长度组成,然后是字符串本身,然后是 可以尝试试错:

import struct
string = b'-'
fmt=">h%ds" % len(string)
t = struct.pack(fmt, len(string), string)
print(repr(t))

for endian in ('>','<'):
    for fmt,size in (('b',1),('B',1),('h',2),('H',2),('i',4),('I',4),
                     ('l',4),('L',4),('q',8),('Q',8)):
        fmt=endian+fmt
        try:
            length,=struct.unpack(fmt,t[:size])
        except struct.error:
            pass
        else:
            fmt=fmt+'{0}s'.format(length)
            try:
                length,string2=struct.unpack(fmt,t)
            except struct.error:
                pass
            else:
                print(fmt,length,string2)
# ('>h1s', 1, '-')
# ('>H1s', 1, '-')

但是,可能会组成一个不明确的字符串t,该字符串具有多个有效的解包,这将导致不同的string2。我不确定。

相关问题 更多 >

    热门问题