我的程序中有两个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它将转换为十进制)。请给我一些建议,并告诉我这是错误的。
提前致谢
答案 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
始终对每个字节使用两个数字,根据需要填充零。