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
相关产品推荐
相关产品推荐

