2012-09-26 16 views
0

我在程序中有兩個uint8_t指針,我想比較這些指針的值。我沒有好主意來處理未簽名的整數。這裏是我的代碼如何在c中比較兩個無符號整數(uint8_t)

static void bacast_signed_message() 
{ 
    uint8_t *M = malloc(MAX_M_LEN*sizeof(uint8_t));//uint8_t M[MAX_M_LEN];//uint8_t *M; 
    int M_len = MAX_M_LEN;; 

    uint8_t *C = malloc((2*KEYDIGITS*NN_DIGIT_LEN + 1 + MAX_M_LEN + HMAC_LEN)*sizeof(uint8_t)); 
    int C_len; 
    //uint8_t C[2*KEYDIGITS*NN_DIGIT_LEN + 1 + MAX_M_LEN + HMAC_LEN]; 

    uint8_t *dM = malloc(MAX_M_LEN*sizeof(uint8_t)); //uint8_t dM[MAX_M_LEN]; 
    int dM_len = MAX_M_LEN; 

    random_data(M, MAX_M_LEN); 

    printf("C before encrypt %p\n",*C); 
    printf("M before encrypt %p\n",*M); 
    printf("dM before encrypt %p\n",*dM); 

    C_len = encrypt(C, (2*KEYDIGITS*NN_DIGIT_LEN + 1 + M_len + HMAC_LEN), M, M_len, &pbkey_alice); 
    //encrypt(uint8_t *C, int C_len, uint8_t *M, int M_len, Point *PublicKey); 

    printf("C after encrypt %p\n",*C); 
    printf("M after encrypt %p\n",*M); 
    printf("dM after encrypt %p\n",*dM); 

    dM_len = decrypt(dM, dM_len, C, C_len, prKey_alice); 
    //decrypt(uint8_t *M, int M_len, uint8_t *C, int C_len, NN_DIGIT *d); 

    printf("C after decrypt %p\n",*C); 
    printf("M after decrypt %p\n",*M); 
    printf("dM after decrypt %p\n",*dM); 

    printf("C_len = %i , M_len = %i\n",C_len,M_len); 

    if (dM == M){printf("Works\n");} 
    else{printf("Not Works\n");} 
} 

,這是出來把我

C before encrypt 0x40 
M before encrypt 0x28 
dM before encrypt 0x70 
C after encrypt 0x4 
M after encrypt 0x28 
dM after encrypt 0x70 
C after decrypt 0x4 
M after decrypt 0x28 
dM after decrypt 0x28 
C_len = 102 , M_len = 41 
Not Works 

如果我改變PRIVATE_KEY(不公鑰的變化),那麼它看起來像這樣

C before encrypt 0x40 
M before encrypt 0x28 
dM before encrypt 0x70 
C after encrypt 0x4 
M after encrypt 0x28 
dM after encrypt 0x70 
C after decrypt 0x4 
M after decrypt 0x28 
dM after decrypt 0x70 
C_len = 102 , M_len = 41 
Not Works 

這意味着DM沒有改變。但我不確定這一點。如果我使用%u代替%p,它會給我完全不同的答案(它表示如果我們使用%u它將轉換爲十進制)。請給我一些建議,並告訴我這有什麼問題。

在此先感謝

+0

這段代碼很痛苦。 – jungledev

回答

2

可能的方式來理解你的問題

您的代碼if (dM == M)目前比較指針。所以你現在正在檢查這兩個指針是否指示相同的內存塊。

您的問題標題建議您要比較單個數字。畢竟,uint8_t只是0-255範圍內的一個數字。如果你有指向這些數字的指針,你必須解除引用他們得到的實際數字,如if (*dM == *M)

但是你的代碼表明你實際上想要比較內存區域。取消引用數組的指針與訪問數組的第一個元素相同(即與if (dM[0] == M[0])相同),這可能不是您想要的。

比較內存區域

您可以使用memcmp內存區域的內容比較:

if (dM_len == M_len && memcmp(dM, M, dM_len) == 0) 

這意味着「如果長度是相同的,並且兩個存儲區域的內容是同樣如此「。如果memcmp的結果非零,則其符號提供關於哪個值被認爲更大的信息。

打印

注意,在你的printf呼叫%p可能是錯誤的:%p是打印指針,但你在函數調用解引用他們,你實際上是在打印。所以%u更合適。如果你想打印例如M,你必須使用一個循環是這樣的:

for (i = 0; i != M_len; ++i) { 
    if (i%32 == 0 && i != 0) printf("\n"); /* wrap lines */ 
    printf("%02x", M[i]); 
} 
printf("\n"); 

這將打印數據的十六進制表示,每行32個字節(= 64個十六進制數字)。 %02x格式指示printf總是對每個字節使用兩位數字,根據需要用零填充。

+0

非常感謝,,,你的解釋對我很有幫助 – cdev

2

有打印的「stdint.h」類型的特定宏。例如:

#include <inttypes.h> 

... 
uint8_t u8 = 5; 
printf("%"PRIu8, u8); // unsigned 
printf("%"PRIx8, u8); // hexadecimal 

因此,你應該改變如:

printf("C after decrypt %p\n",*C); 

printf("C after decrypt %"PRIu8"\n",*C); 

注意%p是打印指針(地址),而不是價值,pointed-至。並且,由於您取消引用C您可能沒有得到您想要的結果。

+0

非常感謝,它運作良好。 – cdev