我有一个c++代码,它期望通过NamedPipe将具有这种格式的结构体发送给它:-
struct InputData {
const std::array<std::array<float, 4>, 5> flexion;
const std::array<float, 5> splay;
const float joyX;
const float joyY;
const bool joyButton;
const bool trgButton;
const bool aButton;
const bool bButton;
const bool grab;
const bool pinch;
const bool menu;
const bool calibrate;
const float trgValue;
};
我正在使用python脚本来提取此信息,然后使用python库结构将其打包并将其发送到c++脚本:-
def encode(flexions, splay, joys, bools):
if splay is None:
splay = [0.0] * 5
if joys is None:
joys = [0.0] * 2
if bools is None:
bools = [False] * 8
packed_flexions = struct.pack('@20f', *flexions)
packed_splays = struct.pack('@5f', *splay)
packed_joys = struct.pack('@2f', *joys)
packed_bools = struct.pack('@8?', *bools)
packed_padded = struct.pack('@f', 0.0)
data = packed_flexions + packed_splays + packed_joys + packed_bools + packed_padded
return data
"flexion"变量实际上是一个4×5 2D矢量,我不知道如何通过struct库发送它,所以我把它扁平化(所以现在它是一个20个元素的python列表),并打包它的元素一个接一个地发送它,但这在c++代码中引发了一个错误。
那么我在这里做错了什么?是问题与c++脚本或我的python实现?
在c++代码中,ReadFile函数在读取消息后返回0字节,所以它接收到消息,但是从中读取0字节,我不知道为什么。
理想情况下,您应该将c++结构体转换为可序列化的形式,如JSON或协议缓冲区。这样,您的python代码就可以将数据反序列化为python友好的对象。
经过长时间的实验,问题是我每次向管道发送消息时都初始化一个新的管道连接,所以无论你发送的是n维数组,都只是将其扁平化,这是正确的方式。