2016-11-07 4 views
0

Этот вопрос немного сложно объяснить, поскольку фрагмент кода является частью более крупного проекта. Я постараюсь объяснить проблему как можно лучше.Memcmp для двух указателей с разными данными

У меня есть два файла

FILE *f,*m; 
    f=fopen("/home/machine/decoder.txt","a+"); 
    m=fopen("/home/machine/offset.txt","a+"); 

В функции я запускаю следующий код,

char *c; 
    int i=0; 
    c = malloc(sizeof(SslDecoder)); 

    //Pick a value from "decoder" file and compare it to a variable in the function 

    while (fgets(c, sizeof(SslDecoder), f) != NULL) { 

    //Print its value to offset file   
    fprintf(m,"%s\n",c); 

    // Print value of another variable to offset file. 

    for(i=0;i<32;i++){ 
    fprintf(m,"%02x",ssl->client_random.data[i]); 
    } 
    fprintf(m,"\n"); 

    //Compare the memory in the pointers. 
    int check = memcmp(c,ssl->client_random.data,32); 
    fprintf(m,"MEMCMP value: %d\n",check); 
    } 

отпечатанных в offset.txt следующих значений

625b70a9659b2fe9ba76ea26d3cfb6126bae4a48b4997548b26d9a101e682bc3 

625b70a9659b2fe9ba76ea26d3cfb6126bae4a48b4997548b26d9a101e682bc3 
MEMCMP value: -44 

Определения client_random и ssl выглядит следующим образом:

 typedef struct _StringInfo { 
     guchar *data;  /* Backing storage which may be larger than data_len */ 
     guint data_len; /* Length of the meaningful part of data */ 
     } StringInfo; 


     typedef struct _SslDecryptSession { 
     StringInfo server_random; 
     StringInfo client_random; 
     StringInfo master_secret; 
     guchar _client_data_for_iv[24]; 
     StringInfo client_data_for_iv; 
     gint state; 
     SslCipherSuite cipher_suite; 
     SslDecoder *server; 
     SslDecoder *client; 
     SslSession session; 

    } SslDecryptSession; 

Я не понимаю, почему значения memcmp не равны нулю. Я подозреваю, что данные, хранящиеся в указателях, кодируются по-разному, но как я могу сравнить значения в этом случае. Я не знаю, являются ли данные шестнадцатеричного или необработанных/ascii-данных в любом из указателей.

+0

Отклоните свой код. –

ответ

1

Данные, которые вы читаете в /home/machine/decoder.txt, являются строкой ASCII.

Вы печатаете его как ASCII (используя %s).

вы сравниваете с данными бинарные данные (вы печатаете использует %02x, выводя его с помощью %s будет печатать мусор в зависимости от данных является ASCII или нет)

Так, конечно, они не равны ,

Для их сравнения вы должны преобразовать двоичные значения в ASCII или ASCII в двоичные. Сделайте свой выбор. Для сравнения обе строки:

char sslstr[65]; 
for(i=0;i<32;i++){ 
    sprintf(sslstr+i*2,"%02x",ssl->client_random.data[i]); 
} 

int check = memcmp(c,sslstr,64); 

стороны: вы читаете текстовый файл на буфере, который слишком мал, и вы должны обнулить-прекратить его, или вы будете иметь мусор в конце строки, когда вы распечатайте его.

0

fgets будет читать все в строке, включая символ новой строки. Ваши звонки

c = malloc(sizeof(SslDecoder)); 
fgets(c, sizeof(SslDecoder), f); 

потенциально является проблемой, если количество символов для чтения больше или равна sizeof(SslDecoder).

Если количество символов для чтения больше или равно sizeof(SslDecoder), ваш код попадает в неопределенную область поведения.

Если вы можете вычислить количество символов для чтения, вам нужно использовать:

c = malloc(numberOfCharactersToRead + 1); // Need an extra char for the null terminator 
fgets(c, numberOfCharactersToRead + 1, f); 

Если количество символов для чтения известно в типе компиляции, вы можете использовать массив.

char array[numberOfCharactersToRead + 1]; 
fgets(c, numberOfCharactersToRead + 1, f); 
Смежные вопросы