Comment puis-je convertir un big-endian struct pour un petit-boutiste-struct?

J'ai un fichier binaire qui a été créé sur une machine unix. C'est juste un tas de documents écrits l'un après l'autre. L'enregistrement est défini à quelque chose comme ceci:

struct RECORD {
  UINT32 foo;
  UINT32 bar;
  CHAR fooword[11];
  CHAR barword[11];
  UNIT16 baz;
}

Je suis à essayer de comprendre comment je pourrais lire et d'interpréter ces données sur une machine Windows. J'ai quelque chose comme ceci:

fstream f;
f.open("file.bin", ios::in | ios::binary);

RECORD r;

f.read((char*)&detail, sizeof(RECORD));

cout << "fooword = " << r.fooword << endl;

Je reçois un tas de données, mais ce n'est pas les données que j'attends. Je suis suspect que mon problème a à voir avec la endian différence des machines, donc je viens de demander à ce sujet.

Je comprends que plusieurs octets seront stockées dans little-endian sur windows et big-endian dans un environnement unix, et je le conçois. Pour les deux octets, 0x1234 sur windows sera 0x3412 sur un système unix.

Ne endianness affectent l'ordre des octets de la structure dans son ensemble, ou de chaque membre de la structure? Quelles démarches devrais-je prendre à la convertir en une structure créée sur un système unix à un qui a les mêmes données sur un système windows? Les liens qui sont plus en profondeur que de l'ordre des octets de quelques octets serait génial, trop!

Vous ne vous posez pas de questions sur eux, mais une autre chose à considérer lorsque l'on travaille avec ce genre de code legacy est bitfields. L'ordre que bitfields sont emballés peuvent être à la fois compilateur et dépendants de la plateforme et non reliées au boutisme du processeur.

OriginalL'auteur scottm | 2009-05-13