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(或%02Xprintf 中的格式至少打印所提供整数的两位数字。它类似于 %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