问题描述
我试图将一个十六进制字符串解码为可读字符串,但每次我尝试它都会输出一个不可读的字符串。
首先我传递十六进制 "2 41 4e 56 0 0 30 30 30 30 30 34 36 56 56 49 3 21"
并将其转换为 byte[]
:
byte[] bb = Enumerable.Range(0,Hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(Hex.Substring(x,2),16))
.ToArray();
然后我尝试将其转换为可读的字符串:
result = Encoding.Default.GetString(bb);
我得到一个不可读的字符串:
$�`Ceed�!
.Default 或 .Unicode,两者都输出与我预期不同的内容。
如果我使用 this tool(设置为 Unicode),它会输出我期望的内容:
ANV0000046VVI!
所以我知道它应该可以工作。
我不知道还能做什么。我以为这就够了,但还不够...
解决方法
从技术上讲,您可以过滤命令字符(0x02
、0x00
、0x03
)并获得所需的结果:
string source = "2 41 4e 56 0 0 30 30 30 30 30 34 36 56 56 49 3 21";
string result = Encoding.UTF8.GetString(source
.Split(' ')
.Select(item => byte.Parse(item,NumberStyles.HexNumber))
.Where(item => item >= ' ')
.ToArray());
Console.Write(result);
结果:
ANV0000046VVI!
现在出现下一个问题:为什么所有这些命令字符都在 source
中?