Чтение бинарных файлов на C в системах UNIX (Ubuntu 10.10) - PullRequest
0 голосов
/ 15 ноября 2010

Я впервые программирую на C и в системе UNIX. Я пытаюсь сделать что-то довольно простое. У меня есть двоичный файл, который является изображением карты камеры Compact Flash и состоит из нескольких изображений JPG. Я пытаюсь прочитать файл, найти последовательность байтов, соответствующую FF D8, FF E0 или FF D8, FF E1, знакам начала файла JPG, затем записать все между этим значком и рядом с новым файлом JPG .

В данный момент я просто пытаюсь заставить мой компьютер распечатать файл как есть, считав его в блоках размером 512 единиц, с указанным размером блоков в исходной файловой системе. У меня есть следующий код:

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main (int argc, char *argv[])
{
    FILE * raw;
    FILE * currentimage;
    char buf[512];
    char beg1[32] = "11111111110110001111111111100001";
    char beg2[32] = "11111111110110001111111111100000";

    raw = fopen("card.raw", "rb");

    while((fread(buf, sizeof(raw), 512, raw) > 0))
    {
        printf(buf);
        printf("\n");

    }
}

Он просто распечатывает файл, отформатированный в том виде, в котором я предполагаю, что это ASCII, так что он выглядит как кучка болтовни. Как я могу получить эти данные в формате двоичных 1 и 0 или, что еще лучше, шестнадцатеричных 0-F?

Любая помощь будет высоко ценится.

P.S. beg1 и beg2 соответствуют двоичным значениям шестнадцатеричных значений, которые я ищу, но они на самом деле не имеют отношения к остальному коду, который у меня есть на данный момент.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

Вы должны прочитать о том, что делает printf (), как, например, в НЕТ ЯЗЫКЕ ПРОГРАММИРОВАНИЯ, если вы EVER используете данные в качестве первого аргумента для printf.Первый аргумент должен быть шаблоном, который, как вы используете, должен быть "% s".Чтобы увидеть вывод в шестнадцатеричном формате, замените ваш цикл следующим:

int size;
while((size = (fread(buf, sizeof(raw), 512, raw)) > 0))
{
    for (int i = 0; i < size; i++)
    {
        printf("%2X", buf[i]);
    }
    printf("\n");

}

Чтобы ответить на ваш вопрос о сравнении в C перед печатью: числовые данные прямо в buf - buf [i] - это символ из -127 до 128, который содержит значение.Если вы хотите посмотреть на его шестнадцатеричное представление, вы можете сделать:

 sprintf(some_other_buffer, "%2X", buf[i]);

Затем вы можете выполнять манипуляции со строками над some_other_buffer, зная, что это строка из 2 символов.

2 голосов
/ 15 ноября 2010

Вместо printf(buf); вам нужно будет перебрать каждый байт и сделать printf("%02x ", byte).Взгляните на источник hexdump здесь:

...