C语言中十六进制字符串解析为可显示中文的实现方法问询
解决C语言中十六进制字符串转UTF-8中文的问题
我懂你的需求——就是要把像"E5A682E682A8"这样的十六进制字符串,转换成和手动写unsigned char output[] = "\xE5\xA6\x82\xE6\x82\xA8";完全一样的字节数据,最终能显示出对应的中文。本质上就是把十六进制字符对逐个解析成实际的字节值,再把这些字节当作UTF-8编码来处理就行。
下面直接给你可运行的代码,再一步步解释逻辑:
完整实现代码
#include <stdio.h> #include <string.h> #include <ctype.h> // 辅助函数:把单个十六进制字符转为0-15的数值 int hex_char_to_val(char c) { if (isdigit(c)) { return c - '0'; } else if (isupper(c)) { return 10 + (c - 'A'); } else if (islower(c)) { return 10 + (c - 'a'); } return -1; // 遇到非法字符返回错误 } // 核心函数:把十六进制字符串转成字节数组,返回转换成功的字节数 int hex_str_to_bytes(const char* hex_str, unsigned char* bytes, size_t max_bytes) { size_t hex_len = strlen(hex_str); // 十六进制字符串长度必须是偶数(两个字符对应一个字节) if (hex_len % 2 != 0) { return -1; } size_t target_byte_count = hex_len / 2; // 检查目标缓冲区是否够大 if (target_byte_count > max_bytes) { return -1; } // 逐组解析十六进制字符 for (size_t i = 0; i < target_byte_count; i++) { int high_nibble = hex_char_to_val(hex_str[2*i]); int low_nibble = hex_char_to_val(hex_str[2*i + 1]); if (high_nibble == -1 || low_nibble == -1) { return -1; // 包含非法十六进制字符 } // 高位左移4位 + 低位,得到完整字节 bytes[i] = (high_nibble << 4) | low_nibble; } return target_byte_count; } int main() { // 你的输入十六进制字符串 const char* input_hex = "E5A682E682A8"; // 定义足够大的缓冲区存储转换后的字节(按需调整大小) unsigned char output_buffer[100]; int converted_bytes = hex_str_to_bytes(input_hex, output_buffer, sizeof(output_buffer)); if (converted_bytes == -1) { printf("错误:输入的十六进制字符串格式无效\n"); return 1; } // 给字节数组加上字符串结束符,这样printf就能正确识别为UTF-8字符串 output_buffer[converted_bytes] = '\0'; printf("转换后的字符串:%s\n", output_buffer); // 应该输出「如果」 return 0; }
关键逻辑解释
- 单个十六进制字符转数值:
hex_char_to_val函数处理0-9、A-F、a-f这些字符,把它们转换成对应的0-15的数值,方便后续组合成字节。 - 十六进制字符串转字节数组:
hex_str_to_bytes函数先检查输入字符串的合法性(长度偶数、无非法字符),然后每两个字符一组,把高位字符的数值左移4位,加上低位字符的数值,得到一个完整的字节。 - 输出UTF-8字符串:转换完成后,给字节数组末尾加上
'\0'(C语言字符串的结束标记),就能直接用printf输出中文了——前提是你的终端支持UTF-8编码(现在大部分终端都支持)。
补充说明
- 你手动写的
unsigned char output[] = "\xE5\xA6\x82\xE6\x82\xA8";其实就是把这些字节直接硬编码到数组里,我们的代码只是把字符串形式的十六进制转换成了同样的字节数据,效果完全一致。 - 如果输入的十六进制字符串长度不是偶数,或者包含非十六进制字符(比如G、%之类的),转换函数会返回-1,你可以根据这个做错误处理。
内容的提问来源于stack exchange,提问作者K J Gor
相关产品推荐
相关产品推荐

