微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无符号字符到十六进制字符串并返回但结果不匹配

如何解决无符号字符到十六进制字符串并返回但结果不匹配

我有一个长度为 32 的无符号字符数组 c1。

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  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。