2010-04-11 9 views
3

Hey, je suis vraiment aux prises avec celui-ci. Je suis tente de transférer un petit morceau de quelqu'un d'autre code à Python, ce qui est ce que j'ai:Fread de Port C (& 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 
    } 

Plus tard, je besoin d'accéder aux données comme ceci: frame.Y [x] [y]

J'ai donc créé une classe 'frame' en Python et inséré les variables correspondantes (frame.Y, frame.Cb, frame.Cr). J'ai essayé de mapper séquentiellement les données de Y [0] [0] à Cr [MAX] [MAX], j'ai même imprimé la structure C en action mais je n'ai pas réussi à comprendre la méthode utilisée pour mettre le données là-dedans. Je me suis battu du jour au lendemain avec ça et je dois retourner à l'armée ce soir, donc toute aide immédiate est la bienvenue et appréciée.

Merci

+5

@ user287669: La bonne façon de marquer une question "résolue" sur stackoverflow est d'accepter une réponse avec l'icône de coche à côté. Cela vous fera également ressembler à un frisson hoopy lorsque vous posez des questions futures. – msw

Répondre

6

Vous devez utiliser le module standard struct python.
De sa documentation (Emphasys ajoutée):

Ce module effectue les conversions entre les valeurs python et C structs représentés sous forme de chaînes python. Il utilise des chaînes de format (expliquées ci-dessous) comme des descriptions compactes de la mise en page de les structures C et la conversion prévue vers/à partir de valeurs Python. Ce peut être utilisé pour traiter des données binaires stockées dans des fichiers ou à partir du réseau connexions, parmi d'autres sources.

Note: que les données que vous lisez à la fin est d'un format uniforme, vous pouvez également utiliser le module array puis « restructurer » les données en Python, mais je pense que la meilleure façon de faire est par en utilisant struct.

+0

Merci, j'ai presque eu ce travail quand j'ai remarqué un bug apparemment insignifiant qui déformait toute ma production. Ma solution est maintenant la même que je l'ai dit en premier - écrire séquentiellement de Y [0] [0] à Cr [MAX] [MAX]. Merci pour l'aide cependant. – kuratkull