1

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

提前致谢

4

2 回答 2

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,您可能没有得到您想要的结果。

于 2012-09-26T06:38:54.500 回答
2

理解您的问题的可能方法

您的代码if (dM == M)当前比较指针。因此,您当前正在检查两个指针​​是否指示相同的内存块。

您的问题标题表明您想比较单个数字。毕竟, anuint8_t只是 0 - 255 范围内的单个数字。如果您有指向此类数字的指针,则必须取消引用它们才能获得实际数字,例如if (*dM == *M).

但是您的代码表明您实际上想要比较内存区域。取消引用指向数组的指针与访问数组的第一个元素相同(即与 相同if (dM[0] == M[0])),这可能不是您想要的。

比较内存区域

您可以使用memcmp来比较内存区域的内容:

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

这意味着“如果长度相同,并且两个内存区域的内容也相同”。如果 的结果memcmp不为零,则其符号提供关于哪个值被认为更大的信息。

印刷

请注意,%pin 您的printf调用可能是错误的:%pis for printing pointers,但是当您在函数调用中取消引用它们时,您实际上是在打印values。所以%u更合适。如果要打印 eg 的内容,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始终为每个字节使用两位数字,并根据需要填充零。

于 2012-09-26T07:16:48.327 回答