【问题标题】:Port C's fread(&struct,....) to Python将 C 的 fread(&struct,....) 移植到 Python
【发布时间】:2011-02-06 16:24:36
【问题描述】:

嘿,我真的很纠结这个。我正在尝试将一小段其他人的代码移植到 Python,这就是我所拥有的:

typedef struct
{
  uint8_t Y[LUMA_HEIGHT][LUMA_WIDTH];
  uint8_t Cb[CHROMA_HEIGHT][CHROMA_WIDTH];
  uint8_t Cr[CHROMA_HEIGHT][CHROMA_WIDTH];
} __attribute__((__packed__)) frame_t;

frame_t frame;

 while (! feof(stdin))
  {
    fread(&frame, 1, sizeof(frame), stdin);

    // DO SOME STUFF
  }

稍后我需要像这样访问数据:frame.Y[x][y]

所以我在 Python 中创建了一个类“框架”并插入了相应的变量(frame.Y、frame.Cb、frame.Cr)。 我试图将数据从 Y[0][0] 顺序映射到 Cr[MAX][MAX],甚至打印出实际使用的 C 结构,但没有设法将我的头脑围绕用于放置数据的方法在那里。我已经为此苦苦挣扎了一夜,今晚必须重返军队,因此非常欢迎和感谢任何即时帮助。

谢谢

【问题讨论】:

  • @user287669:在 stackoverflow 上标记问题“已解决”的正确方法是接受旁边带有复选标记图标的答案。当您将来提出问题时,这也会使您看起来像个笨蛋。

标签: python c struct porting


【解决方案1】:

你必须使用struct python 标准模块。
来自其文档(强调添加):

此模块执行转换 在 Python 值和 C 结构之间 表示为 Python 字符串。它用 格式化字符串(如下所述)为 布局的简洁描述 C 结构和预期的 与 Python 值之间的转换。 这个 可用于处理二进制数据 存储在文件中或来自网络 连接,以及其他来源

注意:由于您最终读取的数据是统一格式的,您也可以使用 array 模块,然后在 Python 中“重组”数据,但我认为最好的方法是使用结构。

【讨论】:

  • 谢谢,当我注意到一个看似毫无意义的错误扭曲了我的所有输出时,我几乎完成了这项工作。我的解决方案现在和我第一次说的一样——从 Y[0][0] 顺序写入 Cr[MAX][MAX]。不过感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多