[英]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.