2013-03-19 4 views
1

Я пытаюсь прочитать файл с окончанием конца файла и определить его шестнадцатеричные значения, если это файл PNG.Откройте файл png и прочитайте его шестнадцатеричные значения в C

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

  • Сперва я читаю первые 16 символов, так как первые 8 шестнадцатеричных значений определяют, имеет ли он правый заголовок. Затем я пытаюсь разделить его и читать как шестнадцатеричное значение, как оно было представлено в каком-то другом разделе здесь.
  • Другое, что я просто хочу прочитать первые два значения и определить, является ли это шестнадцатеричным значением, даже видеть, работает ли оно. Это не.

код:

int IS_PNG_FILE(char *name) 
{ 
    FILE *dat = fopen (name, "rt"); 
    if (dat == NULL) return 1; 
    int data_point; 

    char buf[16], a[16]; 
    fgets(buf, 16, dat); 
    printf("%s\n", buf); 
    int i, b; 
    for (i=0; i<16; i++) 
    { 
     sscanf(&buf[i], "%2x", &b); 
     a[i] = b; 
     i += 2; 
    } 
    printf("%d\n", a); 


    fscanf(dat, "%2x", &data_point); 
    printf("%d\n", data_point); 

    fclose(dat); 
    return 0; 
} 
+4

'FOPEN (имя, "RT")'? try '" rb "' вместо –

+0

Он по-прежнему просто возвращает максимальное число или -2. – Shenkey

+2

PNG-файлы не являются текстовыми. Байты в них не являются шестнадцатеричными «строками» вообще, поэтому 'sscanf' не будет делать то, что вы думаете, и это не метод, который будет полезен. Вы уже прочитали первые 16 байт (хорошо) - вам нужно сравнить значение этих байтов в значении непосредственно с ожидаемыми вами числами. –

ответ

5

Для того, чтобы прочитать двоичные байты от использования файла fread:

Функция Fread() считывает nmemb элементы данных, размер каждого байтам, из поток, на который указывает поток, сохраняя их в месте, указанном ptr.

что-то вроде:

unsigned char head[8]; 

fread(head, sizeof(head), 1, dat); 

вы можете проверить возвращаемое значение, чтобы убедиться, что 8 байт были на самом деле читать.

затем сравнить с помощью memcmp

unsigned char signature[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; 

if (!memcmp(signature, head, 8)) 
{ 
    ... 
} 
Смежные вопросы