2010-04-11 58 views
3

嘿,我真的很苦惱這個。我'嘗試口一小片的別人的代碼到Python,這是我所:Port C的fread(&struct,....)到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結構,但沒有設法繞過用於放置數據在那裏。我一直在這一刻掙扎着,今晚必須回到軍隊,所以任何直接的幫助是非常受歡迎和讚賞的。

感謝

+5

@ user287669:在stackoverflow上標記問題「解決」的正確方法是接受帶有其旁邊複選標記圖標的答案。當你提出未來的問題時,這也會讓你看起來像一團糟。 – msw 2010-04-11 14:21:28

回答

6

你必須使用struct Python標準模塊。
從它的文檔(emphasys加入):

此模塊的Python值並表示爲Python字符串C結構 之間執行轉換 。它使用 格式字符串(在下面解釋)作爲 將C結構和預期的 轉換爲/從Python值進行佈局的簡要描述。 這個 可用於處理存儲在文件中的二進制數據 或來自網絡 的連接,以及其他來源

注意:如您在結束前讀取的數據是統一格式的,你也可以使用array模塊,然後「重組」 Python中的數據,但我認爲最好的方法是使用結構。

+0

謝謝,當我注意到一個看似毫無意義的錯誤扭曲了我所有的輸出時,我幾乎得到了這個工作。現在我的解決方案與我之前說的相同 - 從Y [0] [0]到Cr [MAX] [MAX]順序寫入。 感謝您的幫助。 – kuratkull 2010-04-11 12:00:07