我的程序中有两个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 %pn",*C);
printf("M before encrypt %pn",*M);
printf("dM before encrypt %pn",*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 %pn",*C);
printf("M after encrypt %pn",*M);
printf("dM after encrypt %pn",*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 %pn",*C);
printf("M after decrypt %pn",*M);
printf("dM after decrypt %pn",*dM);
printf("C_len = %i , M_len = %in",C_len,M_len);
if (dM == M){printf("Worksn");}
else{printf("Not Worksn");}
}
这是我得到的
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,它会转换成十进制)。请给我一些建议,告诉我这是怎么回事。
提前感谢
理解问题的可能方法
您的代码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
用于打印指针,但当您在函数调用中取消引用它们时,实际上是在打印值。因此CCD_ 10更合适。如果你想打印例如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
始终为每个字节使用两位数字,并根据需要填充零。
有一些特定的宏用于打印"stdint.h"类型。例如:
#include <inttypes.h>
...
uint8_t u8 = 5;
printf("%"PRIu8, u8); // unsigned
printf("%"PRIx8, u8); // hexadecimal
因此,您应该更改例如:
printf("C after decrypt %pn",*C);
至
printf("C after decrypt %"PRIu8"n",*C);
注意,%p
用于打印指针(地址),而不是所指向的值。由于你取消了C
的引用,你可能没有得到你想要的结果。