C от Big Endian до Little Endian Структура

У меня есть структура, которая определяется как:

struct record
{
   int age;
   char name[12];
   int department;
};

Я не понимаю, как подойти к этой проблеме, если я читаю данные из двоичного файла, а данные содержат структуры, как я могу изменить порядок битов с обратного порядка байтов на обратный порядок байтов в этой структуре?


person user2671024    schedule 11.02.2014    source источник
comment
А как насчет ntohs и друзей?   -  person Michael Foukarakis    schedule 12.02.2014
comment
Есть ли способ сделать это без библиотечных функций?   -  person user2671024    schedule 12.02.2014
comment
@ user2671024 Конечно, но вы бы в конечном итоге дублировали функции почти дословно. В чем смысл?   -  person Sinkingpoint    schedule 12.02.2014
comment
Преобразование между прямым порядком байтов и прямым порядком байтов относится к порядку байтов, а не к порядку битов. Порядок битов внутри каждого байта не меняется.   -  person Gavin H    schedule 12.02.2014
comment
Обратите внимание, что вам просто нужно поменять местами байты age и department - name не будет зависеть от порядка байтов   -  person Paul R    schedule 12.02.2014
comment
Обратите внимание, что машины могут иметь разные размеры для целых чисел, и компиляторы могут добавлять различное количество отступов к структурам, поэтому порядок байтов может быть не единственной вашей проблемой.   -  person Guntram Blohm    schedule 12.02.2014
comment
вам следует прочитать это stackoverflow.com/questions/2100331/   -  person 0x90    schedule 12.02.2014
comment
он влияет на порядок байтов, а не на порядок битов, поэтому здесь нет проблем, если вы используете одну и ту же структуру на машине с малым и большим порядком байтов. лучше использовать атрибут пакета для создания пакета исправлений структуры   -  person user2760375    schedule 12.02.2014


Ответы (1)


Вот простая реализация для преобразования порядка байтов:

// Convert from big to little or vice versa
void convert_record (struct record *bigLittle) {
    int x, temp;

    temp = bigLittle->age;

    for (x = 0; x < sizeof (int); x++) {
        ((char *)&(bigLittle->age))[x] = ((char *)&temp)[sizeof (int) - x]
    }

    temp = bigLittle->department;

    for (x = 0; x < sizeof (int); x++) {
        ((char *)&(bigLittle->department))[x] = ((char *)&temp)[sizeof (int) - x]
    }

    return;
}

Однако, как указал Майкл Фукаракис выше, вам действительно следует использовать ntohs и друзей.

person haneefmubarak    schedule 18.02.2014