Python语言编程系列005——将多个参数打包为字节流进行网络传输的方法

问题提出

使用Python写上位机软件时,若通过网口向硬件端发送命令参数对仪器进行控制,此时需要将多个参数打包为字节流数据后进行网络传输,那么,在Python中怎样将多个参数打包为字节流进行网络传输呢?

如对于一个具体的例子,将下列参数打包成字节流通过网络传输到硬件部分,要求如下:

整个包大小为64Byte

包头为0X“FAA5 FBB5 FCC4 FDD5”

包尾为0X“5FA5 5FB5 5FC5 5FD5”

中间不足部分补0

所有参数皆为有符号整型数字,且初始值、占用字节数定义如下:

解决方法

对于这个问题,可以使用struct、ctypes、socket等模块完成,其具体步骤思路为:

1、用ctypes模块创建64个字节大小的发送缓冲区sendBuffer,代码如下:

2、用struct模块,分别定义包头(fmt_head)、包身(fmt_body,存储待发的具体参数)、包尾(fmt_tail)在字节流中的数据格式,代码如下:

3、利用struct模块的pack_into函数将待发内容打包到缓冲区sendBuffer,代码如下:

其中,headInfo和tailInfo定义的是包头、包尾的信息,即

4、通过socket模块发送到服务器端,代码如下:

备注说明

上面struct模块中支持的格式如下图所示:

打包的后的字节顺序默认上是由操作系统的决定的,struct模块提供了自定义字节顺序的功能,可以指定大端存储、小端存储等特定的字节顺序,对于底层通信的字节顺序是十分重要,不同的字节顺序和存储方式也会导致字节大小的不同。在format字符串前面加上特定的符号即可以表示不同的字节顺序存储方式,例如采用小端存储 s = struct.Struct(‘

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180903A0XOKF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券