无符号字符数组转十六进制字符串还原后与原值不匹配问题求助
问题修复方案
以下是导致数组不匹配的所有错误点及修正方法:
- 修正加密函数传参错误
原代码中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
相关产品推荐
相关产品推荐

