You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无符号字符数组转十六进制字符串还原后与原值不匹配问题求助

问题修复方案

以下是导致数组不匹配的所有错误点及修正方法:

  • 修正加密函数传参错误
    原代码中encrypt(&c1,private_key,public_key,message);的第一个参数类型错误,c1本身是长度为32的unsigned char数组,传参时直接传入c1即可,不需要取地址。取地址得到的是unsigned char (*)[32]类型的数组指针,和加密函数预期的unsigned char *参数类型不匹配,可能导致c1写入结果异常。
    修正后代码:
    encrypt(c1,private_key,public_key,message);
    
  • 补充十六进制字符串结束符
    原转换逻辑申请了sizeof c1 * 2 + 1长度的内存,多出来的1字节是用来存储C字符串必需的\0结束符的,原代码未对该位置赋值,会导致后续sscanf读取时越界访问非法内存,读到垃圾值。
    在十六进制转换循环结束后补充一行:
    sit[sizeof(c1)*2] = '\0';
    
  • 优化格式化与解析的格式符
    原代码使用%02x处理unsigned char类型时,可能出现符号扩展导致高位脏数据,改用%02hhx格式符,明确指定操作对象是unsigned char类型,同时可以省略sscanf的中间变量:
    转换为十六进制的修正代码:
    char *sit = malloc(sizeof c1 * 2 + 1);
    for (size_t i = 0; i < sizeof c1; i++)
    { 
        sprintf(sit + i * 2, "%02hhx", c1[i]);
    } 
    sit[sizeof(c1)*2] = '\0';
    
    还原为字符数组的修正代码:
    unsigned char recvalue[32];
    for(int i=0;i<32;i++)
    {
        sscanf(&sit[i*2], "%02hhx", &recvalue[i]);
    }
    
  • 修正数组打印逻辑
    原代码中printf("Initial value is %02x",c1);和printf("The final value is %02x",recvalue);打印的是数组的首地址,不是数组存储的内容,无法用来判断数组内容是否匹配,需要循环打印每个元素:
    // 打印原数组
    printf("Initial value is: ");
    for (size_t i = 0; i < sizeof c1; i++) {
        printf("%02hhx", c1[i]);
    }
    printf("\n");
    
    // 打印还原后数组
    printf("The final value is: ");
    for (int i = 0; i < 32; i++) {
        printf("%02hhx", recvalue[i]);
    }
    printf("\n");
    

完成以上修改后,原数组和还原后的数组即可完全一致。

内容的提问来源于stack exchange,提问作者Arnab Ghosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 21:06:04