Unsigned char 到 hexstring 并返回但结果不匹配
Unsigned char to hexstring and back but results don't match
我有一个长度为 32 的无符号字符数组 c1。
unsigned char c1[32]
现在我有一个加密函数,详细信息是lengthy.Basically这个加密只是将一些值放入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],"%02x",&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],"%02x",&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
我有一个长度为 32 的无符号字符数组 c1。
unsigned char c1[32]
现在我有一个加密函数,详细信息是lengthy.Basically这个加密只是将一些值放入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],"%02x",&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],"%02x",&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