我正在使用套接字库发送/接收字节,并且正在读取的字节以字符串的形式出现。我想通过
将它们读入一个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