【问题标题】:Line Of Hex Into ASCII十六进制行转换为 ASCII
【发布时间】:2017-08-28 23:00:33
【问题描述】:

我正在尝试制作一个像

这样的十六进制字符串

4100200062006/6006/66006/60063006/6006/6006/6006/60063006/6006/60063006/6006/600630063006/6006/6006/600630063006/600630063006 5006 000/7006006 50063006 $$ >>>>>>>>>>>>>>>>>>>

转成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 中的另一面读取看起来像

A. 。空白的。 。帆布。 。推荐的。 。为了。 。锻造。 .e.d.i.t.i.n.g. .o.n.l.y

十六进制视图中的点是00s,所以我相信对于 ASCII 格式,它们应该什么都不是,以便我得到可读的句子,这就是游戏读取它的方式。我需要做什么才能将mapdesc 转换为 ASCII?

【问题讨论】:

  • C# hex to ascii的可能重复
  • 数据看起来像 UTF16(大端)。您应该能够使用StreamReader 对象直接读取它,唯一可能复杂的是需要在构造函数中指定Encoding.BigEndianUnicode。应该不需要将二进制转换为十六进制,然后再转换回其他数字或文本格式。
  • 哇,好吧,我完全理解你。我不知道为什么我把它变成十六进制然后回到文本。我不认为 StreamReader 在这种情况下实际上可以工作。我会尝试一下,看看会发生什么。
  • 从其他人发现的情况来看,您似乎开始 for 循环一个字节太远了。即使在切换到流式阅读器后,我也觉得你想从 0x1C1-4 开始,而不是 0x1C1
  • 没有文本,只有编码文本。当您阅读文本时,您必须使用编写它的编码。 .NET 的基类库很好地支持了这一点。首先,找到这种文件格式的规范,看看它使用的是哪种编码。

标签: c#


【解决方案1】:

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

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

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

你有两种解决方案来解决这个问题:

要继续以 UTF-8 解码,请从字符串中删除每隔一个 null 字符,所有 _00_s。

或者

以 UTF-16 解码

如果您选择此选项,您的数据仍然存在问题 - 第一个字只有 8 位,这会导致其他字节之间的移位;要在 UTF-16 中解码,请在数据 blob 的开头附加一个 00(或早一点开始循环)

【讨论】:

  • 我想我无法弄清楚这一点。我只是不太了解我需要做什么。
  • 试试(int i = 0x1C0; i &lt;= 0x2EF; i+=2)
  • 现在由于某种原因,richtextbox 只显示零。
猜你喜欢
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 2015-05-22
  • 2017-10-13
  • 2016-09-27
  • 2011-11-21
相关资源
最近更新 更多