2015-12-18 6 views
0

Поскольку я использую команду tftp для передачи важного файла, я бы хотел сравнить md5 для правильной передачи. Примечание: Файл был уже передан в примере нижеСравните md5 после передачи tftp

int main(int argc, char *argv[]) 
{ 
    FILE *input_md5_fd; 
    FILE *md5_fd; 
    size_t md5_length; 
    size_t nbr_items; 
    char *input_md5 = NULL; 
    char *file_md5 = NULL; 
    int ret; 

    chdir("/tmp"); 

    system("tftp -g -r INPUT_MD5 192.168.0.1"); 
    input_md5_fd = fopen("INPUT_MD5", "r"); 
    if (input_md5_fd != NULL) 
    { 
     fprintf(stdout,"MD5 transfered\n"); 
     fseek(input_md5_fd,0L,SEEK_END); 
     md5_length = ftell(md5_fd); 
     input_md5 = malloc(md5_length + 1); 
     fseek(input_md5_fd,0L,SEEK_SET); 
     nbr_items = fread(input_md5, 1, md5_length, input_md5_fd); 
     input_md5[nbr_items] = 0; 
     fprintf(stdout, "length = %lu B\n",md5_length); 
     fprintf(stdout, "contains %s\n", input_md5); 
     fclose(input_md5_fd);  
    } 
    else 
    { 
     return -1; 
    } 

    system("md5sum IMPORTANT_FILE > /tmp/file_md5.txt"); 

    md5_fd = fopen("file_md5.txt", "r"); 
    if (md5_fd != NULL) 
    { 
     file_md5 = malloc(md5_length +1); 
     rewind(md5_fd); 
     nbr_items = fread(file_md5, 1, md5_length, md5_fd); 
     file_md5[nbr_items] = 0; 
     fprintf(stdout, "contains %s\n", file_md5); 
     fclose(md5_fd); 
    } 
    else 
    {  
     return -1; 
    } 

    printf("file_md5 = %s\n", file_md5); 
    printf("input_md5 = %s\n", input_md5); 
    ret = strncmp(file_md5, input_md5, md5_length); 
    printf("ret = %d\n", ret); 

    free(input_md5); 
    free(file_md5); 

} 

Выход:

MD5 transfered 
length = 33 B 
contains a95ef51ec6b1b06f61c97559ddf4868f 

contains a95ef51ec6b1b06f61c97559ddf4868f 
file_md5 = a95ef51ec6b1b06f61c97559ddf4868f 
input_md5 = a95ef51ec6b1b06f61c97559ddf4868f 

ret = 22 

Входные файлы содержат:

# cat /tmp/INPUT_MD5 
a95ef51ec6b1b06f61c97559ddf4868f 

# cat /tmp/file_md5 
a95ef51ec6b1b06f61c97559ddf4868f XXX_XX-XXXX-XX-DD.DDD-DD.DDD.DD.bin 

X является голец и десятичных значений D.

Почему ret не равен 0? Кроме того, я не знаю, откуда 34 происходит от

EDIT: КОДА ОБНОВЛЕНО, проблема возникла из определения md5_length. длинный тип был обменен на size_t

+0

Does 'не input_md5' также содержит символ новой строки, за которым следуют символы' 34 '? В противном случае, откуда это взялось? – Baldrick

+0

Как показывает кошка в этом файле, она не содержит символ '34' ... – ogs

+0

Но переменная' input_md5', похоже, содержит ее, не так ли? Сравните 'strlen (file_md5)' и 'strlen (input_md5)'. Разве они не разные? – Baldrick

ответ

1

Вы рискуете распечатать и сравнить мусор, так как вы не гарантируете, что строки завершены нулем.

Вам нужно сделать

fread(file_md5, 1, md5_length, md5_fd); 
file_md5[md5_length] = 0; 

И похоже на input_md5. Чтобы сделать это правильно, используйте возвращаемое значение fread(), чтобы добавить нулевой терминатор в нужное место, проверьте, не терпит ли fread(), проверьте, сколько он вернул.

Если вы поместите отладочный вывод в кавычках, это будет также легче обнаружить нежелательные пробелы или непечатаемые символы:

fprintf(stdout, "contains '%s'\n", input_md5); 
+0

Я редактировал исходный код, следуя вашим советам. Я все еще получаю '22' как значение вывода strcmp. Однако '34' был удален – ogs

+0

Возможно, вы также можете показать вывод второго предложения, включив вывод в кавычки. Я подозреваю, что один из ваших файлов содержит новую строку, поэтому вы сравниваете новую строку в одном из файлов, которые не существуют в другом файле. - как это также предлагается в комментариях. – nos

+0

Проблема решена, просто обменявшись объявлением md5_length от long до size_t – ogs

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