читать блок диска как растровое изображение - PullRequest
0 голосов
/ 14 мая 2011

Я пытаюсь прочитать блок, который содержит растровое изображение блока и растровое изображение inode

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

for (i = 0; i < 4096; i++) {
    for (j = 8; j <=0 ; j--) {
        bits[j] = bitmap[i]%2;
        bitmap[i] = bitmap[i]/2;
    }
    for(t=0; t<8;t++)
        printf("%d\t",bits[t]);
    printf("\n");
    }

когда я помещаю '0' в char и печатаю его как

printf("%d",'0');

, я получаю 48, и мой битовый массив содержит 00110000, который работает, однако, когда я проверяю битовую карту inode, она не работает, например, битовая карта:

1 1 1 0 0 0 0
но я получаю
0 0 0 0 1 1 1

Я не могу проверить, происходит ли то же самое с битовой картой блока.

Повторим, код работает в обычном режиме, например, он печатает 00110000, который равен 48, для символа '0', который также печатает 48.Это происходит с помощью растрового изображения inode.Когда я перехожу на это, он будет работать для растрового изображения inode, но как я могу теперь это работать для растрового изображения блока?Это исправит код, но логика неверна.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 14 мая 2011

похоже, что ваш битовый заказ поменялся big-endian против little endian. http://en.wikipedia.org/wiki/Endianness Вы можете поменяться с htonl, htons, ntohl, ntohs семейством функций. попробуйте man htons. или запустите свой цикл в обратном порядке.

0 голосов
/ 14 мая 2011

Строки

for(t=0; t<8;t++)
        printf("%d\t",bits[t]);

печатают бит в позиции 0 (младший значащий) первым, а бит в позиции 7 (старший значащий) последним.Если вы хотите, чтобы все было наоборот, измените цикл на:

for(t=7; t>=0;t--)

или аналогичный.

...