2024-05-15 00:26:19 发布
网友
我有一个小问题困扰了我一个小时左右。
string = b'-' t = struct.pack(">h%ds" % len(string), len(string), string) print(t)
此包的结果是b'\x00\x01-'
我遇到的问题是,我不知道如何解包结果b'\x00\x01-'以便它只是'-',是的。我知道我可以把前面的垃圾去掉,但事情会复杂一点。我试着简化一下。希望有人能帮助我。:)
通常不会使用struct.pack将长度头和值放在一起。相反,您只需执行struct.pack(">h", len(data)),通过线路发送(例如在网络协议中),然后发送数据。不需要创建新的字节缓冲区。
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整数。下面是要做的:
data
posn
h
nbytes, = struct.unpack('>h', data[posn:posn+2] posn += 2 the_string = data[posn:posn+nbytes] posn += nbytes
现在你已经为下一个项目做好了准备。
注意:如果您编写的代码仅限于Python2.5或更高版本,则可以使用unpack_from()
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。我不确定。
t
string2
通常不会使用
struct.pack
将长度头和值放在一起。相反,您只需执行struct.pack(">h", len(data))
,通过线路发送(例如在网络协议中),然后发送数据。不需要创建新的字节缓冲区。在您的情况下,您可以简单地执行以下操作:
但正如我所说,如果你有一个基于套接字的应用程序,它会是这样的:
假设
data
是一个很大的字节块,您已经成功地解析出了第一个posn
字节。这个字节块的文档表明,下一项是一个字节字符串,前面是一个16位有符号(不太可能,但您确实说过h
格式)的bigendian整数。下面是要做的:现在你已经为下一个项目做好了准备。
注意:如果您编写的代码仅限于Python2.5或更高版本,则可以使用
unpack_from()
在这里,您将包装长度和字符串:
因此,解包时,您应该希望返回两个值,即长度和字符串:
一般来说,如果您不知道字符串是如何打包的,那么就没有可靠的fire方法来恢复数据。你只要猜就行了!
如果你知道数据 由字符串的长度组成,然后是字符串本身,然后是 可以尝试试错:
但是,可能会组成一个不明确的字符串
t
,该字符串具有多个有效的解包,这将导致不同的string2
。我不确定。相关问题 更多 >
编程相关推荐