How to compare two unsigned integers (uint8_t) in c

Refresh

February 2019

Views

6.5k time

1

I have two uint8_t pointers in my program and I want to compare the values of those. I don't have good idea to deal with unsigned ints. Here is my code

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

and this is the out put I got

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

And if I changed private_key(no change of public key) then It looks like this

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

That mean dM has not changed no. But I am not sure about this. If I use %u instead of %p it will give me totally different answers(it says if we use %u it'll convert to decimal). Please give me some advice, and tell me whats wrong with this.

Thanks in advance

2 answers

2

There are specific macros for printing the "stdint.h" types. For instance:

#include <inttypes.h>

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

Hence you should change e.g:

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

to

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

Note that %p is for printing pointers (addresses), and not the-value-pointed-to. And since you de-reference C you probably are not getting the results you want.

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равен нулю, его знак содержит информацию о том , какое значение считается больше.

печать

Обратите внимание , что %pв ваших printfзвонках, вероятно , неправильно: %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чтобы использовать два ВСЕГДА цифры для каждого байта, отступы с нулем по мере необходимости.

MvG