python - 管道发送和接收。 unpack 需要长度为 4 的字符串参数

标签 python struct pipe

了解该 qn 已被询问。但是根据上一个线程提供的答案,我仍然无法让我的程序运行。

#!/usr/bin/env python
import pika
import os
import sys
import time
import struct
path= "pipe"

fifo=open(path,'r')
while True:
    var=fifo.read()
    if var:
      if len(var) == 8:
        print struct.unpack("<l", var)[0]
      print len(var)

我想从我的管道中读取内容。我有一个 C++ 程序将 8 个字节的结构发送到管道。如果我要更改 C++ 程序以仅发送长数据类型(4 个字节),并将 if len(var) == 8: 更改为 if len(var) == 4:,我可以正确获取数据。但如果我发送 8 个字节的结构(2 个长数据类型),我会收到错误。

非常感谢您的帮助。谢谢。

最佳答案

对于 8 字节有符号长整型数据类型,您需要使用“q”格式字符,而不是“l”字符。

格式代码显示在 documentation 的第 7.3.2.2 节中。

作为一个简单的示例运行此代码,它以 4 或 8 字节有符号长发送,并在接收时检查长度并使用适当的代码:

import os
import struct

pipein, pipeout = os.pipe()

#txdata = struct.pack("<l", 12345)
txdata = struct.pack("<q", 12345)
print len(txdata)

os.write(pipeout, txdata)

var = os.read(pipein, 1024)
print len(var)
if (len(var) == 4):
    print struct.unpack("<l", var)[0]
if (len(var) == 8):
    print struct.unpack("<q", var)[0]

关于python - 管道发送和接收。 unpack 需要长度为 4 的字符串参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45003478/

相关文章:

swift - 你能利用 Swift 的结构默认初始化器来简化参数传递吗?

linux - 在命令行参数中使用管道

C 多处理/管道

kubernetes - Gitlab CI管道失败:标记问题

python - scipy curve_fit 在拟合大值曲线时失败

python - 列表中的数字相乘

c++ - 如何有效地使用包含来自另一个源文件的运算符的结构定义?

Python CV2 色彩空间转换保真度损失

Python 正则表达式 findall 不打印所有

c - 将指针改组为指向结构的指针