You need to enable JavaScript to run this app. C# 十六进制转可读字符串输出乱码的技术问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

C# 十六进制转可读字符串输出乱码的技术问题咨询

乱码问题核心原因

十六进制解析逻辑与输入格式完全错位

  • 现有字节转换代码默认输入是无分隔、偶数长度的连续十六进制字符串,比如"414e563030303030343656564921"这类格式。
  • 但实际传入的是带空格分隔的分段十六进制串,还包含多个仅1位长度的十六进制段,硬按连续字符切分的逻辑会完全错位:
    举例来说,把原始串的空格全部移除后拼接为连续字符串"2414e560030303030303436565649321",按现有代码切出的第一组2个字符是"24",转成字节为0x24,对应ASCII的$,和你输出的首个乱码字符完全匹配;后续切出的0x14、0xe5都是不可打印的控制字符/半字节非完整字符,自然会出现乱码块。

解码编码选择错误

  • 你测试用的Encoding.Default在中文Windows环境下对应GBK编码,Encoding.Unicode对应UTF-16小端编码,都不是目标文本使用的单字节ASCII编码,哪怕字节数组解析正确,用这两个编码解码也会出现内容不符的问题。
修复方案

第一步:重写十六进制解析逻辑

适配输入的带空格分段格式,逐段解析为字节,避免字符错位:

// 按空格拆分非空的十六进制分段
string[] hexSegments = Hex.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
byte[] bb = hexSegments
    // 单字符段自动补前导0,保证可以正确解析为单字节
    .Select(seg => seg.PadLeft(2, '0'))
    .Select(seg => Convert.ToByte(seg, 16))
    // 过滤掉不可打印的控制字节,匹配目标输出结果
    .Where(b => b >= 0x20 && b <= 0x7E)
    .ToArray();

第二步:替换解码用的编码

放弃Encoding.Default和Encoding.Unicode,改用单字节ASCII编码完成转换:

result = Encoding.ASCII.GetString(bb);
最终效果

按照上述逻辑处理后,输出字符串为ANV0000046VVI!,和预期结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 08:54:03