[英]How to compare two unsigned integers (uint8_t) in 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它將轉換為十進制)。 請給我一些建議,並告訴我這有什么不對。
提前致謝
有用於打印“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
用於打印指針(地址),而不是值指向的。 因為你取消引用C
你可能沒有得到你想要的結果。
您的代碼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
始終為每個字節使用兩個數字,根據需要填充零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.