Проблема при преобразовании выходных данных с прямым порядком байтов в формате Endian в Big Endian (C-программирование) - PullRequest
0 голосов
/ 13 мая 2018

Я борюсь с проблемой, которая требует, чтобы я выполнил шестнадцатеричный дамп в объектный файл, который я создал с помощью функции fopen ().

Я объявил необходимую целочисленную переменную (в HEX) следующим образом:

//Declare variables
    int code = 0xCADE;

Вывод должен быть большим Endian, поэтому я поменял местами байты следующим образом:

//Swap bytes
    int swapped = (code>>8) | (code<<8);

Затем я открыл файл для двоичного вывода следующим образом:

//Open file for binary writing
    FILE *dest_file = fopen(filename, "wb");

Затем я записал код переменной (соответствующий 16-битному слову) в файл следующим образомusing fwrite ():

//Write out first word of header (0xCADE) to file
    fwrite(&swapped, sizeof(int), 1, dest_file);

После компиляции, запуска и выполнения hexdump для файла, в который записано содержимое, я наблюдаю следующий вывод:

0000000 ca de ca 00                                    
0000004

В основном, все правильно, вплоть до лишних "около 00".Я не уверен, почему это там, и нужно удалить его так, чтобы мой вывод был просто:

0000000 ca de                                    
0000004

Я знаю, что проблема Endianness была решена широко в стеке, но после выполнения поиска, мне неясно, каккак классифицировать эту проблему.Как я могу подойти к этой проблеме, чтобы удалить «00»?

Большое спасибо.

РЕДАКТИРОВАТЬ:

Я изменил оба:

 //Declare variables
        int code = 0xCADE;

//Swap bytes
        int swapped = (code>>8) | (code<<8);

to:

//Declare variables
    unsigned short int code = 0xCADE;

//Swap bytes
    unsigned short int swapped = (code>>8) | (code<<8);

И я наблюдаю:

0000000 ca de 00 00                                    
0000004

, что приближает меня к тому, что мне нужно, но все еще есть дополнительное "00 00".Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Чтобы избежать путаницы, код, который переупорядочивает байты, должен использовать байты (uint8 или char), а не многобайтовые типы, такие как int.

Для замены двух байтов:

char bytes[2];
char temp;

fread(bytes, 2, 1, file1);

temp = bytes[0];
bytes[0] = bytes[1];
bytes[1] = temp;

fwrite(bytes, 2, 1, file2);

Если вы используете int, вы, вероятно, обманываете себя, полагая, что его размер равен 2 (хотя, скорее всего, 4), и предполагаете, что ваша система записывает int в файлы, что может быть неверно.Если вы работаете с байтами, сюрпризов быть не может - ваш код делает именно то, что и выглядит.

0 голосов
/ 13 мая 2018

Вы говорите fwrite записать sizeof(int) байтов, что в вашей системе оценивается в 4 байта (размер int равен 4).Если вы хотите записать два байта, просто выполните:

fwrite(&swapped, 2, 1, dest_file);
...