C# 无法将十六进制转换为可读字符串

问题描述

我试图将一个十六进制字符串解码为可读字符串,但每次我尝试它都会输出一个不可读的字符串。

首先我传递十六进制 "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!

所以我知道它应该可以工作。

我不知道还能做什么。我以为这就够了,但还不够...

解决方法

从技术上讲,您可以过滤命令字符(0x020x000x03)并获得所需的结果:

  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 中?