【问题标题】:Read bytes from min and max hex offsets with C#使用 C# 从最小和最大十六进制偏移量读取字节
【发布时间】:2012-04-14 22:45:06
【问题描述】:

我希望能够从通过 2 个字符串字符串 minO 和字符串 maxO 给出的最小和最大十六进制偏移量中读取字节。之后我只需要将字节转换为字符串。

//Setup byte reader.
FileStream fs = new FileStream(EditOpen.FileName, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
long length = fs.Length;
//Read bytes to textBox1.
string minO = 0x00001844;
string maxO = ???
br.BaseStream.Position = minO;
byte[] example = br.ReadBytes(0x000003FC);
textBox1.Text = BitConverter.ToString(example);

0x00001844 是最小值,0x00001C3F 是最大值,0x000003FC 是十六进制的差异。

这是输出:

73-20-67-6C-61-73-73-5F-62-72-65-61-6B-20-22-30-22-2E-2E-00-73-20-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-20-73-20-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-2E-73-20-70-65-72-6B-5F-65-78-74-72-61-42-72-65-61-74-68-20-22-39-39-39-22-2E-2E-2E-2E-2E-2E-2E-00-73-20-6D-6F-74-69-6F-6E-54-72-61-63-6B-65-72-52-61-6E-67-65-20-22-39-39-39-39-22-2E-2E-2E-2E-2E-2E-00-00-00-73-20-6C-6F-62-62-79-5F-61-6E-69-6D-61-74-69-6F-6E-53-70-65-65-64-20-22-36-30-22-2E-2E-2E-2E-2E-2E-2E-00-00-73-20-67-6C-61-73-73-5F-73-68-61-74-74-65-72-65-64-5F-73-63-61-6C-65-20-22-30-22-2E-2E-2E-2E-2E-2E-2E-00-00-73-20-67-6C-61-73-73-5F-66-72-69-6E-67-65-5F-6D-61-78-73-69-7A-65-20-22-31-30-30-22-2E-2E-2E-2E-2E-2E-2E-00-73-20-75-69-5F-67-61-6D-65-74-79-70-65-20-22-73-64-22-00-00-73-20-67-5F-67-61-6D-65-74-79-70-65-20-22-73-64-22-00-00-00-73-20-70-61-72-74-79-5F-67-61-6D-65-74-79-70-65-20-22-73-64-22-00-00-00-73-20-67-61-6D-65-74-79-70-65-20-22-22-00-00-00-6D-61-70-6E-61-6D-65-00-56-41-5F-46-4F-52-57-41-52-44-00-00-73-20-61-63-74-69-76-65-61-63-74-69-6F-6E-20-22-70-65-72-6B-5F-62-75-6C-6C-65-74-50-65-6E-65-74-72-61-74-69-6F-6E-4D-75-6C-74-69-70-6C-69-65-72-20-33-30-3B-70-65-72-6B-5F-64-69-76-65-47-72-61-76-69-74-79-53-63-61-6C-65-20-2E-30-31-3B-70-65-72-6B-5F-64-69-76-65-56-65-6C-6F-63-69-74-79-20-30-3B-70-65-72-6B-5F-64-69-76-65-44-69-73-74-61-6E-63-65-43-68-65-63-6B-20-39-39-39-3B-70-65-72-6B-5F-65-78-74-65-6E-64-65-64-4D-65-6C-65-65-52-61-6E-67-65-20-39-39-39-3B-70-65-72-6B-5F-67-72-65-6E-61-64-65-44-65-61-74-68-20-61-63-31-33-30-5F-31-30-35-6D-6D-5F-6D-70-3B-70-65-72-6B-5F-77-65-61-70-52-61-74-65-4D-75-6C-74-69-70-6C-69-65-72-20-2E-30-31-3B-63-67-5F-67-75-6E-5F-78-20-36-3B-67-6C-61-73-73-5F-66-72-69-6E-67-65-5F-6D-61-78-63-6F-76-65-72-61-67-65-20-31-30-30-30-30-30-30-3B-6D-6F-74-64-20-5E-31-47-65-74-5E-35-53-68-69-69-74-5E-37-4F-6E-5E-31-4B-69-64-73-20-20-20-5E-39-42-79-20-5E-32-42-55-53-54-45-44-5E-33-54-57-49-4E-4B-49-45-20-20-5E-34-40-7B-3D-33-5E-32-3C-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-5E-31-4A-4F-49-4E-20-5E-35-77-77-77-2E-58-62-6F-78-5E-37-33-36-30-5E-31-44-65-76-65-6C-6F-70-65-72-73-2E-5E-35-63-6F-6D-5E-32-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-3D-38-3B-70-65-72-6B-5F-73-70-72-69-6E-74-4D-75-6C-74-69-70-6C-69-65-72-20-35-3B-70-6C-61-79-65-72-5F-6C-61-73-74-53-74-61-6E-64-43-72-61-77-6C-53-70-65-65-64-53-63-61-6C-65-20-32-3B-70-6C-61-79-65-72-2B-73-70-72-69-6E-74-54-69-6D-65-20-39-39-39

我希望输出为纯文本而不是十六进制。我该怎么做?

【问题讨论】:

  • 祝你好运!可能需要添加一些代码,以便我们可以实际帮助您解决您遇到的问题。
  • 我刚刚接受了所有的回答。
  • 您的问题不清楚。首先,您提到了 maxO 和 minO,但是您的代码中缺少具有这些名称的变量。此外,您说您“需要将字节转换为 string”,但随后您还说“我想要二进制”。这个函数的期望输出究竟是什么?细绳?二进制?无论如何,“二进制”是什么意思?这是作业吗?如果是这样,如果您发布完整的问题,它可能会澄清。失败了,输出的一些例子。
  • 不,这不是家庭作业,让我添加 maxO 和 minO
  • minO 很容易添加,但我不知道如何添加 maxO,我只知道如何添加要从 minO 加载的字节数。

标签: c# encoding hex


【解决方案1】:

二进制或十六进制输出:

您可以使用Convert.ToString(byte, base) 将字节转换为不带任何分隔符的十六进制字符串。 Base 可以是二进制的 2 或十六进制的 16。

在 for 循环中使用它来转换所有字节:

StringBuilder builder = new StringBuilder();
foreach(byte b in example)
{
    builder.Append(Convert.ToString(b, 16).PadLeft(2,'0'));
}
textBox1.Text = builder.ToString();

纯文本编码:

如果你想要纯文本,你必须知道文件的编码。对于 UTF8,您将使用:

textBox1.Text = System.Text.Encoding.UTF8.GetString(example);

告诉我这是否适合你。

【讨论】:

  • 我说二进制我的意思是明文是个错误。
  • 有一个小错误,您必须添加 PadLeft,以便它始终写入 2 个字符,必要时在前面添加一个零。查看更新的代码。
  • 或者如果你的意思是普通文本,使用 System.Text.Encoding.UTF8.GetString(example)
  • 现在只需要转成明文即可。
  • 我不确定我是否理解该评论。如果您使用纯文本编码,则不需要任何其他代码。只有一行(没有任何 StringBuilder)。
【解决方案2】:

如果我没听错的话,你想要二进制值而不是十六进制值吗?您可以通过以下方式编码:

var bytes = br.ReadBytes(0x000003FC)
    .Select(x => Convert.ToString(x, 2));

然后根据需要使用 String.Join 连接字符串。例如:

textBox1.Text = String.Join(" ", bytes);

要获得纯文本,ofc,您应该使用编码。如果是 UTF8:

textBox1.Text = Encoding.UTF8.GetString(example);

【讨论】:

  • 您确实看到了它当前给我的输出吗?该输出必须是纯文本。
猜你喜欢
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2018-08-27
  • 2012-12-29
  • 1970-01-01
相关资源
最近更新 更多