2016-11-07 2 views
0

이 코드는 코드 조각이 큰 프로젝트의 일부이기 때문에 설명하기가 약간 어렵습니다. 내가 할 수있는 최선의 방법으로 문제를 설명하려고 노력할 것이다. 의다른 데이터가있는 두 포인터의 Memcmp

625b70a9659b2fe9ba76ea26d3cfb6126bae4a48b4997548b26d9a101e682bc3 

625b70a9659b2fe9ba76ea26d3cfb6126bae4a48b4997548b26d9a101e682bc3 
MEMCMP value: -44 

정의를 다음과 같이

나는 두 개의 파일

나는 다음과 같은 코드를 실행하는 기능에서
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에 인쇄 된 값

은이 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의 값이 0이 아닌 이유를 모르겠습니다. 포인터에 저장된 데이터가 다르게 인코딩 된 것으로 판단되지만이 경우 값을 비교하는 방법은 무엇입니까? 데이터가 16 진수 형식인지 또는 포인터 중 하나의 원시/아스키 데이터인지는 알 수 없습니다.

+0

코드를 들여 씁니다. –

답변

1

/home/machine/decoder.txt에있는 데이터는 ASCII 문자열입니다.

ASCII로 인쇄하고 있습니다 (%s 사용).

당신이 비교하는 데이터는 이진 데이터 그래서 물론 그들이 동일하지 않은

(당신이 데이터에 따라 ASCII 여부되는 쓰레기를 인쇄합니다 %s를 사용하여 인쇄, %02x을 사용하고 인쇄하고)입니다 .

비교하려면 이진 값을 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은 줄 바꿈 문자를 포함하여 모든 줄을 읽습니다. 읽을 수있는 문자의 수보다 크거나 sizeof(SslDecoder) 동일한 경우 통화

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

잠재적 문제입니다.

읽을 문자 수가 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);