如何在Python中从套接字读取字节数组

3

我正在使用蓝牙将一个16字节的字节数组发送到Python服务器。基本上,我想要实现的是按原样读取字节数组。如何在Python中做到这一点。

目前我所做的是读取字符串,因为那是我知道从套接字读取数据的唯一方法。以下是我用于Python套接字的代码:

data = client_sock.recv(1024)

请问这里的data是字符串吗?有什么建议吗?

2个回答

5

你已经在做你所要求的事情了。

data 是从套接字接收到的原始字节。

在Python 3.x中,它是一个 bytes 对象,这只是一个不可变的 bytearray 版本。在Python 2.x中,它是一个 str 对象,因为 strbytes 是相同的类型。但无论哪种方式,该类型都只是一串字节。

如果你想将这些字节作为数字而不是字符访问:在Python 3.x中,仅索引或迭代 bytes 就可以实现,但在Python 2.x中,你必须对每个字符调用 ord。这很容易。

或者,在两个版本中,你可以只调用 data = bytearray(data),它会创建数据的可变 bytearray 副本,当你索引或迭代它时,它会给你数字而不是字符。

例如,假设我们想在Python 2.7中将每个字节的十进制值写在单独的一行文本文件中(这是一个愚蠢的事情,但它演示了这些思想):

data = client_sock.recv(1024)
with open('textfile.txt', 'a') as f:
    for ch in data:
        f.write('{}\n'.format(ord(ch)))

谢谢,太好了!是否也可以使用ord函数来获取4个字节而不是一个,并将这4个字节表示为浮点数? - user2426316
@user2426316:不,ord函数只能将每个值作为0-255的整数提取出来;你必须手动计算如何从这四个整数构造一个浮点数,而这不是你想做的。你可能正在寻找struct.unpack函数。 - abarnert

0
你需要的是 struct 模块,具体来说是 struct.unpack()

从他的评论来看,那确实是他最终想要的,但这绝对不是按原样读取字节的方法。 - abarnert
没错,我确实是想把它作为你回答的扩展。唯一可能需要补充的是多字节值转换时可能存在的大小端问题,但如果他们正在通过网络进行二进制数据传输,他们应该已经意识到这些问题了。 - MJ Howard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接