是否存在将Python2.x字符串转换为Python3.x字节的更好的解决方案?

时间:2019-06-20 18:10:20

标签: python-3.x bluetooth python-2.x pybluez

我正在使用套接字库发送/接收字节,并且正在读取的字节以字符串的形式出现。我想通过

将它们读入一个numpy数组
received_bytes = socket.recv(100)
#example: received_bytes = str(b'\x01\x01')
np.frombuffer(received_bytes, dtype="uint8")

,因此,如果接收的字节为"b'\x01\x02'",我将得到[1, 2]。但是,现在,我会得到一些类似[92, 120, 48, 49, 92, 120, 48, 50]的信息,表明每个字符都在转换(92 <->'\',120 <->'x'等...),而不是每个4个字符的字节字符串。

关于插槽: 我正在使用Pybluez通过蓝牙进行操作,但是我在MacOS上支持有限,因此我相信我拥有的Pybluez只是使用LightBlue软件包的包装。我怀疑/很确定LightBlue是用Python2.x编写的,这可以解释为什么socket.recv()函数返回str对象而不是bytes对象(就像Python2.x一样)两者可互换使用)。因此,除非有一个我应该使用的更好的蓝牙库(很难在OSX和Python上找到可以使用的东西),否则我一直在寻找一种在Python3.x字符串和字节之间进行转换的方法。 我确实尝试通过LightBlue库进行操作,看看是否可以修改返回数据的方式,但是经过几层后,它似乎可以连接一些ObjC代码,但我不确定是否有一个“快速修复”只需将某些内容强制转换为字节,而不是在管道中更早的字符串。

令人沮丧的是,np.fromstring()满足了我的要求,但已弃用,并说要使用np.frombuffer(我无法使用)。我不愿意使用np.fromstring(),因为我不想依赖不推荐使用的代码(并且每次调用它都会留下令人讨厌的警告消息)。我也不确定为什么我不能使用np.frombuffer()模拟np.fromstring()

我尝试了很多事情,有几种方法可行,但恐怕它们并不是最有效的。

1。 除了np.fromstring()之外,唯一起作用的是以下内容:

received_string = str(b'\x01\x02')
bytes = eval("b'" + received_string + "'")

我对eval函数的了解并不多,但是我认为这不是实现我想要的效果的有效方法。不过,也许我错了……无论如何,请让我知道这是否是一个好的解决方案,或者我是否应该让更好的转换之一来工作。

2。 我使用received.encode('unicode-escape')将字符串转换为字节,但是每次我以b'\\x01\\x02'形式的字节对象结束时(请注意双斜杠),而这与np.frombuffer()不兼容。我还查看了以下相关问题,但这些解决方案都不适合我:

Converting double slash utf-8 encoding Converting python2 byte/string encoding to python3

#What I want: (because np.frombuffer() will perform correctly on this)
a = b'\x01\x02'

#What I begin with:
b = str(a)

import codecs

print(codecs.encode(b, "latin-1"))
# >>> b"b'\\x01\\x02'"

b = b[2:-1] #b = \x01\x02
print(codecs.encode(b, "latin-1"))
# >>> b'\\x01\\x02' #DOUBLE SLASHES



0 个答案:

没有答案