使用Python将二进制数据写入套接字(或文件)

时间:2009-03-26 15:33:58

标签: python

假设我有一个套接字连接,另一方的第三方监听器希望看到数据以非常结构化的方式流动。例如,它查找一个表示正在发送的消息类型的无符号字节,后跟一个表示消息长度的无符号整数,然后是另一个无符号字节,它实际上是一个有一些标志设置或未设置等的字段。

我如何在python中执行此操作?我只是想知道如何可靠地生成这些数据,并确保我正确发送它(即我实际上发送的是无符号字节,而不是说有符号整数或更糟糕的字符串)。

3 个答案:

答案 0 :(得分:11)

使用struct模块构建缓冲区并写入。

答案 1 :(得分:4)

处理Python对象和二进制表示(两个方向)之间过渡的一种非常优雅的方法是使用Construct library

在他们的文档中,您将找到很多使用它的好例子。几年来我一直在使用串行通信协议和解码二进制数据。

答案 2 :(得分:0)

在最低级别,套接字I / O包括向套接字读取或写入一串字节值。为此,我将要写入的信息编码为包含字节值的字符串,并将其写入套接字。我这样做是通过创建一个超级字符串,然后一次附加一个字符。例如,创建Modbus /以太网读取请求:

    readRequest = """"""
    readRequest += chr(self.transactionID / 0x100)  # Transaction ID MSB         (0)
    readRequest += chr(self.transactionID % 0x100)  # Transaction ID LSB         (1)
    readRequest += chr(0)                           # Protocol ID MSB (Always 0) (2)
    readRequest += chr(0)                           # Protocol ID LSB (Always 0) (3)
    readRequest += chr(0)                           # Length MSB (Always 0)      (4)
    readRequest += chr(6)                           # Length LSB (Always 6)      (5)
    readRequest += chr(0)                           # Unit ID (Always 0)         (6)

    readRequest += chr(0x04)                        # Function code 4     (0)
    readRequest += chr(startOffset / 0x100)         # Starting offset MSB (1)
    readRequest += chr(startOffset % 0x100)         # Starting offset LSB (2)
    readRequest += chr(0)                           # Word count MSB      (3)
    readRequest += chr(2 * nToRead)                 # Word count LSB      (4)

    sockOutfile.write(readRequest)

要将多字节值转换为字符串,以便将它们附加到I / O字符串上,请使用struct模块中的“Pack()”函数。此函数将一个或多个单字节或多字节值转换为单个字节值的字符串。

当然,这种方法就像锤子一样简单。当字符串中的默认字符编码是Unicode而不是ASCII时,需要修复它。