2013-12-09 60 views
0

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

我现在正在做的是读取一个字符串,因为这是我知道如何从套接字读取数据的唯一方法。这是我在Python中的插座代码

data = client_sock.recv(1024) 

其中data是字符串。有任何想法吗?

回答

3

您已经在按照您的要求进行操作。

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))) 
+0

谢谢,那太棒了!是否也可以使用'ord'函数来取4个字节而不是1个,并将这4个字节表示为一个浮点数? – user2426316

+0

@ user2426316:否,'ord'函数可以将您的每个值作为0-255之间的整数;你必须弄清楚如何从这四个整数中手动构造一个浮点数,你不想这样做。您可能正在寻找['struct.unpack'](http://docs.python.org/2/library/struct.html#struct.unpack)。 – abarnert

0

你想要的是struct模块。特别是struct.unpack()

+0

这听起来像他最终想要的,从他的评论中,但它绝对不是按原样读取字节的方式。 – abarnert

+0

没错,我真的是把它当作你答案的扩展。我唯一可能添加的是多字节值转换的(潜在)端到端问题,但如果他们通过网络执行二进制数据,他们应该已经意识到这些问题。 –

相关问题