将C语言的fread(&struct,....)移植到Python

3 投票
1 回答
621 浏览
提问于 2025-04-15 21:28

嘿,我现在遇到了一些困难。我正在尝试把别人的一小段代码移植到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'的类,并插入了相应的变量(frame.Y, frame.Cb, frame.Cr)。我尝试将数据从Y[0][0]顺序映射到Cr[MAX][MAX],甚至打印出了C语言的结构体在运行时的样子,但就是没能搞明白是怎么把数据放进去的。我昨晚一直在为这个问题苦恼,今晚还得回军队,所以任何能立即提供的帮助我都非常欢迎和感激。

谢谢

1 个回答

6

你需要使用 struct 这个Python标准模块。
根据它的说明(加重强调部分):

这个模块可以在Python值和C语言结构体之间进行转换,这些结构体用Python字符串表示。它使用格式字符串(下面会解释)来简洁地描述C结构体的布局,以及如何在Python值和C结构体之间进行转换。这可以用来处理存储在文件中的二进制数据,或者来自网络连接的数据,等等。

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

撰写回答