Как вывести произвольную структуру в C? - PullRequest
5 голосов
/ 14 июля 2011

Я не знаю, в каком направлении идти, может быть, что-то вроде отражения поможет?

Ответы [ 3 ]

3 голосов
/ 25 ноября 2015

Ответ @Kerrek SB работает очень хорошо, я просто пишу, как использовать его в функции, использующей указатель void.

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;
}
3 голосов
/ 14 июля 2011

Вот шестнадцатеричный дамп, настолько общий, насколько вы можете его получить:

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]);

Обратите внимание, что результат этого полностью определяется реализацией;по-видимому, будет много отступов, и вы не будете знать, что означает любое из напечатанных значений.(Большинство из них, вероятно, будут просто указателями на какую-то другую часть пространства.)

Как говорит Этьен, C является языком статической типизации и не имеет рефлексии, поэтому вы должны знать объявление Foo для интерпретации содержания x.

2 голосов
/ 14 июля 2011

Что вы хотите сделать со своим файлом, когда получите его?Если это будет считано позже, просто используйте fread и fwrite, например

struct foo * bar;
fwrite(bar,sizeof(*bar),1,stdout);

...

fread(bar,sizeof(*bar),1,stdin);

Это даст двоичный вывод, который зависит от вашего компилятора / платформы, если онибез изменений вы должны быть в порядке.Оттуда вы также можете подать файл в шестнадцатеричный ридер и т. Д., Хотя вам нужно знать макет структуры, чтобы делать с ней что-нибудь полезное.

...