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

