Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带变量的结构解包_Python_Python 3.x_Struct - Fatal编程技术网

Python 带变量的结构解包

Python 带变量的结构解包,python,python-3.x,struct,Python,Python 3.x,Struct,我试图将我的代码转换为python3,在使用problem时,我遇到了一个关于Struct的问题。当我在解包时不使用变量时,它会给出我想要的结果,但当我使用变量时,它不会给出它需要给出的结果 我使用名为“dataReceived”的def从套接字获取数据。我用struct解包 没有变量的代码(它给出了真实的结果)(结果是2)(数据包和我从套接字获得的数据包相同): 带有变量的代码(从def dataReceived获取数据包)(给出错误结果)(结果为98)(两个数据包相同) 对接收到的字节值调用

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

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

没有变量的代码(它给出了真实的结果)(结果是2)(数据包和我从套接字获得的数据包相同):

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


对接收到的字节值调用
str
,与您认为的不同

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

>>> bs = b'\x02'
>>> struct.unpack('!b', bs)
(2,)
在新代码中,
字节
值转换为字符串:

>>> s = str(bs)
然后打开包装:

>>> 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

bytes
值调用
str
,将
字节
'
repr
作为字符串;要将
字节
作为字符串获取,我们需要调用
字节
值的
解码
方法。请注意,您的数据包似乎编码为拉丁语-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]

我只是在那里写了个假,它需要是“this.package”。你能创建一个失败的吗?否则,问题很可能出在其他地方。此外,
bytes('\x02…','utf-8')
格式看起来非常危险,而且容易损坏,因为它依赖于编码。
b'\x02…'
有什么问题?如果我想将未打包的数据放在字符串中怎么办?我想将原始数据放在字符串中。
>>> s
"b'\\x02'"
>>> struct.unpack('!b', bytes(s, 'utf-8')[:1])
(98,)
>>> s = bs.decode('latin-1')
>>> struct.unpack('!b', bytes(s, 'latin-1'))
(2,)
def dataReceived(this, packet):
    this.package = packet.decode('latin-1')  # Store packet data as a unicode string
    packetFormat = unpack('!b', packet[:1])[0]