问题描述
unsigned char c1[32]
现在我有一个加密函数,它的细节很长。基本上这个加密只是将一些值放入c1中。
encrypt(&c1,private_key,public_key,message);
printf("Initial value is %02x",c1);
char *sit = malloc(sizeof c1 * 2 + 1);
for (size_t i = 0; i < sizeof c1; i++)
{ sprintf(sit + i * 2,"%02x",c1[i]);
}
现在我尝试取回无符号字符数组:
unsigned char recvalue[32];
for(int i=0;i<32;i++)
{
unsigned testchar=0;
sscanf(&sit[i*2],&testchar);
recvalue[i]=(unsigned char)testchar;
}
printf("The final value is %02x",recvalue);
现在这里的 c1 和 recvalue 的值不匹配,但我需要它们匹配。任何帮助将不胜感激。
解决方法
%02x
中的 %02X
(或 printf
)格式至少打印所提供整数的两位数字。它就像一个 %u
,但会打印以十六进制基数给出的值。但是,您给它的是一个数组的地址。
看来您将它与 %s
格式混淆了,实际上您给出了字符串的初始地址,它将打印整个字符串。
%02x
是不同的。它需要一个整数值。
对数组进行索引,以便为它提供实际的字节值:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main()
{
unsigned char c1[32] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x00,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20 };
char *sit = malloc(sizeof c1 * 2 + 1);
for (size_t i = 0; i < sizeof c1; i++)
{
sprintf(sit + i * 2,"%02x",c1[i]);
}
printf("Initial value is: ");
for (size_t i = 0; i < sizeof c1; i++)
printf("%02X ",c1[i]);
printf("\n");
printf("sit is: %s\n",sit);
unsigned char recvalue[32];
for(int i=0;i<32;i++)
{
unsigned testchar=0;
sscanf(&sit[i*2],&testchar);
recvalue[i]=(unsigned char)testchar;
}
printf("The final value is: ");
for (size_t i = 0; i < sizeof recvalue; i++)
printf("%02X ",recvalue[i]);
printf("\n");
return 0;
}
输出:
Initial value is: 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20
sit is: 0102030405060708090a0b0c0d0e0f001112131415161718191a1b1c1d1e1f20
The final value is: 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20