十六行到ASCII

时间:2017-04-03 22:37:36

标签: c#

我正在尝试制作像

这样的十六进制字符串
  

4100200062006C0061006E006B002000630061006E0076006100730020007200650063006F006D006D0065006E00640065006400200066006F007200200046006F007200670065002000650064006900740069006E00670020006F006E006C0079002E

变成ASCII,看起来像:

  

仅建议使用Forge编辑的空白画布。

十六进制的变量是从我打开到程序中的文件中收集的,读取一个特定的地址,如下所示:

BinaryReader br = new BinaryReader(File.OpenRead(ofd.FileName));
string mapdesc = null;

for (int i = 0x1C1; i <= 0x2EF; i++)
{
    br.BaseStream.Position = i;
    mapdesc += br.ReadByte().ToString("X2");
}

richTextBox1.Text = ("" + mapdesc);

现在我有了mapdesc,我把它打印到了richtextbox中,它看起来像是一行十六进制。我希望它看起来也像可读的ASCII。

在十六进制编辑器中,用ANSI读取的另一面看起来像

  

一个。 。空白。 。帆布。 。推荐的。 。对于。 。锻造。 .e.d.i.t.i.n.g。 .o.n.l.y

十六进制视图中的点是00 s,所以我相信ASCII格式,它们应该没有任何东西,以便我得到可读的句子,这就是游戏的读取方式。如何将mapdesc转换为ASCII?

1 个答案:

答案 0 :(得分:0)

公平地说,输出完全匹配解码输出,问题实际上与输入数据有关。

如果你仔细观察,你会注意到其他一对字符是00,使用一些简单的启发式方法,我们可以确定这里有16位字,4个十六进制字符。

您面临的问题以及.字符的原因是,在将其解码为UTF-8时,其他每个字符都将 null

您有两种解决方案可以解决这个问题:

要继续以UTF-8解码,请从字符串中删除所有其他 null 字符,所有_00_s。

或者

以UTF-16解码

如果选择此选项,您的数据仍然存在问题 - 第一个字只有8位,这将导致其他字节之间的转换;以UTF-16解码,在数据blob的开头添加一个额外的 00 (或者更快地开始循环一个位置)