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

C语言10字节转十六进制串查询MySQL无返回结果问题排查

问题原因

你的代码核心问题出在10字节转十六进制字符串的逻辑上,三个致命错误导致生成的字符串和数据库中存储的20位十六进制串不匹配:

  • 没有补前导0:单字节值小于16时,比如0x05,你的逻辑只会生成字符5而非预期的05,最终字符串长度不足20位
  • 0值字节完全缺失:如果buffer中存在0x00的字节,while(quotient != 0)循环不会执行,该字节对应的两个字符位直接空缺,字符串长度进一步错乱
  • 未加字符串结束符:hex_bytes数组填充完成后没有手动补充\0作为字符串结尾,后续printf、sprintf操作会读取到数组后方的内存垃圾,导致查询字符串完全不符合预期

另外你遍历查询结果的循环上限用了未定义来源的sr_nos_size,如果该值和实际返回的行数不一致,也会出现无法正常打印结果的问题。

修复方案

替换你原来的十六进制转换逻辑为更稳妥的位操作写法,直接拆分每个字节的高低四位生成两位十六进制字符,最后补结束符:

unsigned char buffer[10];   //示例:{23, 181, 185, 192, 101, 156, 61, 247, 206, 204}
unsigned char hex_bytes[21];

// 修正后的十六进制转换逻辑
for(int i = 0; i < 10; i++) {
    // 拆分高4位和低4位
    unsigned char high_nibble = (buffer[i] >> 4) & 0x0F;
    unsigned char low_nibble = buffer[i] & 0x0F;
    // 转小写十六进制字符,和数据库存储格式对齐
    hex_bytes[i*2] = high_nibble < 10 ? ('0' + high_nibble) : ('a' + high_nibble - 10);
    hex_bytes[i*2 + 1] = low_nibble < 10 ? ('0' + low_nibble) : ('a' + low_nibble - 10);
}
// 必须补字符串结束符
hex_bytes[20] = '\0';

// 验证生成的字符串是否正确,调试用
printf("Ticket no. = %s,长度:%d\n", hex_bytes, (int)strlen(hex_bytes));

同时修改查询结果遍历逻辑,用MySQL官方API获取结果行数:

result = mysql_store_result(con);
// 用mysql_num_rows获取实际返回的结果行数
int row_count = mysql_num_rows(result);
for(int i =0; i < row_count; i++) {
    MYSQL_ROW row = mysql_fetch_row(result);
    printf("--sn: %s\n", row[0]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:15:05