11
votes

Comment puis-je jeter une structure arbitraire en C?

Je ne sais pas quelle direction aller, peut-être quelque chose comme une réflexion aidera?


3 commentaires

C n'a pas de support de réflexion indigène.


Vous devez décoller c pour obtenir une réflexion. Véritable C programmeurs de programmation en hex.


Dupliqué possible de Imprimer une structure en C


4 Réponses :


3
votes

Voici un vidage hexagonal, à propos d'aussi général que possible:

struct Foo x;

unsigned int i;
const unsigned char * const px = (unsigned char*)&x;

for (i = 0; i < sizeof(x); ++i) printf("%02X ", px[i]);


2 commentaires

et ajoutez un printf ("\ n") à la fin, la sortie ne peut donc pas être tamponnée.


@HEX: "\ n" ne plonge pas nécessairement le tampon, vous devez appeler fflush (stdout) . Peut-être que vous pensez à C ++.



2
votes

Que voulez-vous faire avec votre fichier une fois que vous l'avez? Si cela va être lu à une heure ultérieure, utilisez simplement Fread et fwrite , comme xxx

Ceci donnera une sortie binaire dépend de votre compilateur / plate-forme, tant que ceux-ci sont inchangés, vous devriez aller bien. De là, vous pouvez également nourrir le fichier dans un lecteur hexagonal, etc., bien que vous devez connaître la disposition de la structure pour faire quoi que ce soit utile.


0 commentaires

4
votes

La réponse de @kerrek SB fonctionne vraiment bien, je viens de dire comment l'utiliser dans une fonction à l'aide d'un pointeur vide.

int dump(void *myStruct, long size)
{
    unsigned int i;
    const unsigned char * const px = (unsigned char*)myStruct;
    for (i = 0; i < size; ++i) {
        if( i % (sizeof(int) * 8) == 0){
            printf("\n%08X ", i);
        }
        else if( i % 4 == 0){
            printf(" ");
        }
        printf("%02X", px[i]);
    }

    printf("\n\n");
    return 0;
}

int main(int argc, char const *argv[])
{
    OneStruct data1, data2;

    dump(&data1, sizeof(OneStruct));

    dump(&data2, sizeof(OneStruct));

    return 0;
}


1 commentaires

Si vous travaillez dans PHP / ZEND Extensions, changez Printf sur php_printf et fonctionne! Bon spectacle!



9
votes

Si vous utilisez Clang 8 ou plus récent, vous pouvez maintenant utiliser la fonction Compiler intégrée __ intégrée_dump_tructrum pour vider une structure. Il utilise les informations naturellement disponibles au moment de la compilation pour générer du code qui imprime plutôt une structure.

Exemple de code démontrant la fonction:

Dumptrucduct.c: xxx

exemple compile-and-exécution: xxx

si vous n'utilisez pas de clang> = 8 Mais vous utilisez GCC, Il est assez facile de changer. Il suffit d'installer le package Clang-8 ou CLANG-9 et remplacez les invocations de gcc avec clang .


0 commentaires