用Variab解压结构

2024-05-17 08:21:47 发布

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

我正在尝试将我的代码转换为python3,我在使用problem时遇到了一个关于Struct的问题。当我在解包时不使用变量时,它会给出我想要的结果,但是当我使用变量时,它并没有给我它需要的结果。在

我使用名为“dataReceived”的def从套接字获取数据。我用struct解包。在

不带变量的代码(给出真实结果)(结果为2)(数据包与我从socket获得的数据包相同):

packetFormat = unpack('!b', b'\x02\x01]\x00\x1c\x01\x01\xb0\x00\taMtIyfKal\x00\x07ActiveX\x00\x165.0 (Windows)-Netscape\x00)\xed\x06\x00\x00\x00@3407d2fbeefadbf85fa0f48bbac8337e026e0669b6be226156fd6fb4d575ef16\x00\xd9A=t&SA=t&SV=t&EV=t&MP3=t&AE=t&VE=t&ACC=t&PR=t&SP=f&SB=f&DEB=f&V=WIN 28,0,0,137&M=Adobe Windows&R=1280x1024&COL=color&AR=1.0&OS=Windows 8&ARCH=x86&L=tr&IME=t&PR32=t&PR64=t&PT=ActiveX&AVD=f&LFD=f&WD=f&TLS=t&ML=5.1&DP=72\x00\x00\x00\x00\x00\x00\x02\xca\x00\x00'[:1])[0]
print(packetFormat)

带变量的代码(从def dataReceived获取数据包)(结果为假)(结果为98)(两个数据包相同)

^{pr2}$

Tags: 代码windowsdefsocket数据包structpython3problem
1条回答
网友
1楼 · 发布于 2024-05-17 08:21:47

对接收到的字节值调用str并不像您认为的那样。在

这是一种古老的、良好的行为:

>>> bs = b'\x02'
>>> struct.unpack('!b', bs)
(2,)

在新代码中,bytes值被转换为字符串:

^{pr2}$

然后打开包装:

>>> struct.unpack('!b', bytes(s, 'utf-8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: unpack requires a bytes object of length 1

字符串值似乎有点奇怪:

>>> s
"b'\\x02'"
>>> struct.unpack('!b', bytes(s, 'utf-8')[:1])
(98,)

bytes值调用str会给我们一个字符串bytes'repr;要将bytes作为字符串,我们需要调用bytes值的decode方法。请注意,您的数据包数据似乎编码为拉丁语1,而不是utf-8。对于第一个字节来说,这并不重要,但是如果您想解码整个bytestring,这就有关系了。在

>>> s = bs.decode('latin-1')
>>> struct.unpack('!b', bytes(s, 'latin-1'))
(2,)

因此,不要对您解包的bytes值调用str,要么对其进行解码,要么将其保留为bytes并避免不必要的编码和解码。不过,您可以将字节解码为unicode字符串并将其存储在实例中。在

def dataReceived(this, packet):
    this.package = packet.decode('latin-1')  # Store packet data as a unicode string
    packetFormat = unpack('!b', packet[:1])[0]

相关问题 更多 >