2016-11-07 9 views
0

この問題は、コードスニペットが大きなプロジェクトの一部であるため説明するのが少し難しいです。私は可能な限り問題を説明しようとします。異なるデータを持つ2つのポインタのMemcmp

私はの

625b70a9659b2fe9ba76ea26d3cfb6126bae4a48b4997548b26d9a101e682bc3 

625b70a9659b2fe9ba76ea26d3cfb6126bae4a48b4997548b26d9a101e682bc3 
MEMCMP value: -44 

定義は次のようにoffset.txtに印刷された値が、私は次のコードを実行機能には二つのファイル

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); 
    } 

を持っていますclient_randomとsslは次のようになります。

memcmpの値がゼロでない理由はわかりません。私は、ポインタに格納されたデータが異なって符号化されていると思うが、その場合の値をどのように比較するのだろうか?私は、データが16進数型か、ポインタのいずれかのraw/asciiデータであるかどうかはわかりません。

+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は改行文字を含めてすべての行を読み込みます。あなたの通話

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); 
関連する問題