2017-01-26 10 views
-1

Я пытаюсь прочитать шестнадцатеричные значения из файла изображения, используя C. В Linux этот код работает нормально, но с Windows он читает только первые 334 байта, и я не понимаю Зачем.Чтение шестнадцатеричного значения из изображения в C

Код для чтения файла является:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/stat.h>  
void readHexFile(char* path) { 
     FILE *fp; 

     if ((fp = fopen (path, "r")) != NULL) { 
      struct stat st; 
      stat(path, &st);     

      int i; 
      int ch; 
      for (i = 0; i < st.st_size; i++) { 
       ch = fgetc(fp);    
       printf("%x ", ch); 
      } 

      fclose(fp); 
     } 
     else { 
      return NULL; 
     } 
} 

st.st_size приходит из <sys/stat.h> пакета и содержит правильное значение (размер в байтах файла изображения)

Это изображение показать, что мои программа выводит, и фактическое содержимое двоичного файла он читает:

enter image description here Как вы видите после последовательности 17, 18, 19 есть также шестнадцатеричные значения, но моя программа печатает ffffffff несколько раз.

+0

Ожидается, что вас увидят. См. [Ask] и укажите [mcve]. И не размещайте изображения текста! – Olaf

+0

Да, но изображение показывает правильные шестнадцатеричные значения – Davide

+1

* 'st.st_size поступает из пакета' * - какой пакет? – Wolf

ответ

1

Я думаю, что ваш цикл должен выглядеть следующим образом:

int ch; 
while (!feof(fp)) { 
    ch = fgetc(fp); 
    printf("%x ", ch); 
} 

Это совершенно непонятно мне, почему вы используете st.st_size здесь.

+0

Если я использую цикл while, он печатает до 0x19, но файл длиннее и длиннее. – Davide

+0

Ну, ваша проблема была явно [в текстовом режиме] (http://stackoverflow.com/a/41876316/2932052). Но в чем причина не использования 'foef': производительности? – Wolf

+0

Да. Я использовал st.st_size, чтобы показать вам ошибки hex. Да, теперь я уже использую EOF – Davide

5

Вы открыли файл в формате , а не как двоичный код. Различные платформы могут вести себя по-разному.

В этом случае Microsoft Windows решила, что это обычный текстовый файл заканчивается на первое вхождение Ctrl+Z (0x1A) и возвращает EOF для всех fgetc впоследствии.

Явное утверждают, что вы хотите, чтобы открыть файл в двоичном виде:

fp = fopen ("yourfile", "rb"); 

и проблема уходит.

+0

Wow! Благодарю. Вы спасли мою жизнь. Теперь работает отлично! – Davide

+0

Отлично, но если '0x1A' означает' Ctrl + Z', почему вы помещаете его в круглые скобки? – Wolf

1

В Windows персонаж 0x1A (Ctrl + Z) : символ EOF для текстового режима; см. this question.

Если вы читаете из двоичного файла, как JPEG, вы должны сделать это с первого открытия файла в двоичном (fopen режим "rb"), затем fread в предварительно выделенный буфер, размер которого будет определять с ftell с указателем файла в конце файла:

size_t i, len; 
char *buffer = NULL; 
fp = fopen(argv[1], "rb"); 
if(!fp) 
    // handle error 

fseek(fp, 0, SEEK_END); 
len = ftell(fp); 
rewind(fp); 

buffer = malloc(len + 1); 
if(!buffer) 
    // handle error 

fread(buffer, 1, len, fp); 
for(i = 0; i < len; i++) 
{ 
    printf("%.2X ", buffer[i]); 
} 

free(buffer); 
buffer = NULL; 

 Смежные вопросы

  • Нет связанных вопросов^_^