如何正确填充缓冲区?

时间:2019-01-30 17:06:59

标签: python types buffer

我正在用python与鹦鹉无人机通信(跳跃相扑),我需要每25ms向他发送一个缓冲区以维持连接。问题,我不知道该怎么办^^

受此代码启发,以javascript编写:https://github.com/forgeByAcision/node-sumo/blob/master/lib/sumo.js 我试图将其翻译为:

var buf = new Buffer(7);

buf.writeUInt8(constants.ARCOMMANDS_ID_PROJECT_JUMPINGSUMO, 0);
buf.writeUInt8(constants.ARCOMMANDS_ID_JUMPINGSUMO_CLASS_PILOTING, 1);
buf.writeUInt16LE(constants.ARCOMMANDS_ID_JUMPINGSUMO_PILOTING_CMD_PCMD, 2);
buf.writeUInt8(this._pcmd.flag || 1, 4);
buf.writeInt8(this._pcmd.speed || 0, 5);
buf.writeInt8(this._pcmd.turn || 0, 6);

我听说过struct库,但是被卡住了。 如何编写这样的类型,如何仅更改变量的字节顺序?

PS:我没有被插槽卡住(嗯,我想)

2 个答案:

答案 0 :(得分:0)

您可以使用struct将数据打包到缓冲区中。像这样:

from struct import *
buf = ['\0'] * 7

pack_into('BBHBbb', buf, 0, constants.ARCOMMANDS_ID_PROJECT_JUMPINGSUMO, constants.ARCOMMANDS_ID_JUMPINGSUMO_CLASS_PILOTING, constants.ARCOMMANDS_ID_JUMPINGSUMO_PILOTING_CMD_PCMD,...)

格式字符串也可以具有表示字节顺序的初始字符。参见documentation

答案 1 :(得分:0)

最后,我使用struct模块将数据打包到这样的缓冲区中:(假设第二个arg需要格式化为little-endian)

import struct

buf = struct.pack("BBHBbb", constant1, 255 - constant2, constant3, constant4 ....)