簡體   English   中英

如何比較c中的兩個無符號整數(uint8_t)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM