如何比较c中的两个无符号整数(uint8_t)

时间:2012-09-26 06:27:19

标签: c pointers compare unsigned-integer

我的程序中有两个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它将转换为十进制)。请给我一些建议,并告诉我这是错误的。

提前致谢

2 个答案:

答案 0 :(得分: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用于打印指针(地址),而不是值指向的。而且,由于您取消引用C,您可能无法获得所需的结果。

答案 1 :(得分: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始终对每个字节使用两个数字,根据需要填充零。