假设我有一个套接字连接,另一方的第三方监听器希望看到数据以非常结构化的方式流动。例如,它查找一个表示正在发送的消息类型的无符号字节,后跟一个表示消息长度的无符号整数,然后是另一个无符号字节,它实际上是一个有一些标志设置或未设置等的字段。
我如何在python中执行此操作?我只是想知道如何可靠地生成这些数据,并确保我正确发送它(即我实际上发送的是无符号字节,而不是说有符号整数或更糟糕的字符串)。
答案 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时,需要修复它。