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

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;
}

关键逻辑解释

  1. 单个十六进制字符转数值:hex_char_to_val函数处理0-9、A-F、a-f这些字符,把它们转换成对应的0-15的数值,方便后续组合成字节。
  2. 十六进制字符串转字节数组:hex_str_to_bytes函数先检查输入字符串的合法性(长度偶数、无非法字符),然后每两个字符一组,把高位字符的数值左移4位,加上低位字符的数值,得到一个完整的字节。
  3. 输出UTF-8字符串:转换完成后,给字节数组末尾加上'\0'(C语言字符串的结束标记),就能直接用printf输出中文了——前提是你的终端支持UTF-8编码(现在大部分终端都支持)。

补充说明

  • 你手动写的unsigned char output[] = "\xE5\xA6\x82\xE6\x82\xA8";其实就是把这些字节直接硬编码到数组里,我们的代码只是把字符串形式的十六进制转换成了同样的字节数据,效果完全一致。
  • 如果输入的十六进制字符串长度不是偶数,或者包含非十六进制字符(比如G、%之类的),转换函数会返回-1,你可以根据这个做错误处理。

内容的提问来源于stack exchange,提问作者K J Gor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:44:34