繁体   English   中英

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

[英]Writing binary data to a socket (or file) with Python

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

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

使用struct模块构建一个缓冲区并编写它。

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

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

在最低级别,套接字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时,需要修复它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM