Бинарный перевод - PullRequest
       18

Бинарный перевод

1 голос
/ 19 апреля 2011
#include <stdio.h>

int main() {
  unsigned char data[1];

  FILE *f = fopen("bill.jpg", "rb");

  while (!feof(f)) {
    if (fread(data, 1, 1, f) > 0) {
      printf("0x%02x\n", data[0]);
    }
  }
  fclose(f);
}

Это правильно?Я беспокоюсь, потому что если я просматриваю файл с помощью hexdump, я получаю совершенно другой вывод.

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Извините, но нет - while (!feof(f)), по сути, всегда неверно - обычно будет считываться последний элемент в файле дважды.Вот довольно полезный шестнадцатеричный самосвал, который я написал несколько лет назад:

/* public domain by Jerry Coffin, tested with MS C 10.0 and BC 4.5
 */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    unsigned long offset = 0;
    FILE *input;
    int bytes, i, j;
    unsigned char buffer[16];
    char outbuffer[60];

    if ( argc < 2 ) {
        fprintf(stderr, "\nUsage: dump filename [filename...]");
        return EXIT_FAILURE;
    }

    for (j=1;j<argc; ++j) {

        if ( NULL ==(input=fopen(argv[j], "rb")))
            continue;

        printf("\n%s:\n", argv[j]);

        while (0 < (bytes=fread(buffer, 1, 16, input))) {
            sprintf(outbuffer, "%8.8lx: ", offset+=16);
            for (i=0;i<bytes;i++) {
                sprintf(outbuffer+10+3*i, "%2.2X ",buffer[i]);
                if (!isprint(buffer[i]))
                    buffer[i] = '.';
            }
            printf("%-60s %*.*s\n", outbuffer, bytes, bytes, buffer);
        }
        fclose(input);
    }
    return 0;
}
1 голос
/ 19 апреля 2011

Это должно правильно напечатать первый байт файла в шестнадцатеричном формате.

Проверьте документацию для используемой утилиты Hexdump или сообщите нам, какая платформа используется.Некоторые утилиты дампа отображают байты в обратном порядке в каждой строке, чтобы сделать чтение с прямым порядком байтов более интуитивно понятным, как только вы поймете, что он делает.

...