Нужна помощь в понимании того, что делает эта функция - PullRequest
0 голосов
/ 16 января 2019

Я хочу понять, как эта функция работает в C. Я считаю, что она используется, чтобы помочь создать заголовок для файла, как указано в его имени. Это часть файла большего размера, который обрабатывает изображения. Эта часть кода, однако, после завершения обработки:

void header( int row, int col, unsigned char head[32] )
{
    int *p = (int *)head;
    char *ch;
    int num = row * col;

    /* Choose little-endian or big-endian header depending on the machine. Don't modify this */
    /* Little-endian for PC */

    *p = 0x956aa659;
    *(p + 3) = 0x08000000;
    *(p + 5) = 0x01000000;
    *(p + 6) = 0x0;
    *(p + 7) = 0xf8000000;

    ch = (char*)&col;
    head[7] = *ch;
    ch ++; 
    head[6] = *ch;
    ch ++;
    head[5] = *ch;
    ch ++;
    head[4] = *ch;

    ch = (char*)&row;
    head[11] = *ch;
    ch ++; 
    head[10] = *ch;
    ch ++;
    head[9] = *ch;
    ch ++;
    head[8] = *ch;

    ch = (char*)#
    head[19] = *ch;
    ch ++; 
    head[18] = *ch;
    ch ++;
    head[17] = *ch;
    ch ++;
    head[16] = *ch;

    /*
    // Big-endian for unix
    *p = 0x59a66a95;
    *(p + 1) = col;
    *(p + 2) = row;
    *(p + 3) = 0x8;
    *(p + 4) = num;
    *(p + 5) = 0x1;
    *(p + 6) = 0x0;
    *(p + 7) = 0xf8;
    */
}

1 Ответ

0 голосов
/ 16 января 2019

Little-endian против big-endian относится к способу хранения многобайтовых значений в памяти.На машине с прямым порядком байтов он переходит от младшего значащего байта к старшему значащему байту, тогда как машина с прямым порядком байтов идет в обратном порядке.скажем по простоте кода в случае с прямым порядком байтов - каждое поле просто присваивается напрямую.

Для случая с прямым порядком байтов байты в каждом int должны быть обращены.Для констант это легко, вы просто переставляете шестнадцатеричные значения.Для передачи целых чисел в функцию вы должны разбить их на 4 отдельных байта и сохранить каждый в отдельности.

...