Шестнадцатеричные значения пишутся в неправильном порядке - PullRequest
0 голосов
/ 27 марта 2012

Используя следующий код для записи в файл

int main(int argc, char * argv[])
{
    uint32_t pattern1, pattern2;
    int i, times;
    sscanf("ae75db0f", "%x", &pattern1); 
    sscanf("518a24f0", "%x", &pattern2);
    FILE * outFile = fopen(argv[1],"wb");
    printf ("Pattern 1: %0x \nPattern 2: %0x \n", pattern1, pattern2);

    times = 524288; // Write out 4 mB of data

    for (i = 0; i < times; i++) {
        fwrite(&pattern1, 4, 1, outFile);
        fwrite(&pattern2, 4, 1, outFile);
    }
    fclose (outFile);
}

В командной строке я делаю xxd file |less

00018c0: f024 8a51 0fdb 75ae f024 8a51 0fdb 75ae  .$.Q..u..$.Q..u.
00018d0: f024 8a51 0fdb 75ae f024 8a51 0fdb 75ae  .$.Q..u..$.Q..u.
00018e0: f024 8a51 0fdb 75ae f024 8a51 0fdb 75ae  .$.Q..u..$.Q..u.
00018f0: f024 8a51 0fdb 75ae f024 8a51 0fdb 75ae  .$.Q..u..$.Q..u.

Не отображаются «правильные» значения, которые должны были быть записаны в сам файл.

Ответы [ 5 ]

3 голосов
/ 27 марта 2012

Добро пожаловать в мир байтов:

http://en.wikipedia.org/wiki/Endianness

Архитектуры x86 / x64 (как и большинство современных архитектур) имеют младший порядок байтов: это означает, что многобайтовые значения сохраняются в памяти с наименьшими значащими байтами (младший адрес памяти).

2 голосов
/ 27 марта 2012

Чтобы уточнить ответ @ ouah, вы должны определить порядковый номер вашей системы.

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

pattern1 = (pattern1 >> 16) | (pattern1 << 16);
1 голос
/ 27 марта 2012

Если вы прочитаете их как uint32_t s на той же машине, они вернутся с теми же значениями.

То, что вы видите на диске, совпадает с тем, что вы увидите в памяти, если вы посмотритена базовом char с.

1 голос
/ 27 марта 2012

Это может показывать правильный порядок, правда в том, что вы не можете сделать такое утверждение без знания Endianness вашей платформы .

Это отличный пример того, почему нужно быть очень внимательным при чтении не байтов и записи байтов.

1 голос
/ 27 марта 2012

Вы обнаружили Порядковый номер .Если вы хотите изменить порядок в обратном направлении, посмотрите на такие функции, как htonl.

...