【问题标题】:C# Reading files and encoding issueC#读取文件和编码问题
【发布时间】:2014-04-18 20:37:49
【问题描述】:

我到处寻找这个答案,所以希望它不是重复的。我决定我终于要在这里问了。

我有一个名为 Program1.exe 的文件 当我将该文件拖到记事本或 Notepad++ 中时,我会得到各种随机符号,然后是一些可读文本。但是,当我尝试在 C# 中读取此文件时,我得到的结果要么不准确,要么只是一个大 MZ。我已经在 C# 中尝试了所有支持的编码。记事本程序如何读取这样的文件,但我根本不能?我尝试将字节转换为字符串,但它不起作用。我尝试直接逐行阅读,但它不起作用。我什至尝试过二进制,但它不起作用。

感谢您的帮助! :)

【问题讨论】:

  • 你是用什么类来阅读的?有什么示例代码可以看吗?

标签: c# encoding binary byte


【解决方案1】:

将二进制文件作为文本读取是一件很奇怪的事情,但这是可能的。任何 8 位编码都可以做到这一点。例如,下面的代码打开并读取一个可执行文件并将其输出到控制台。

const string fname = @"C:\mystuff\program.exe";
using (var sw = new StreamReader(fname, Encoding.GetEncoding("windows-1252")))
{
    var s = sw.ReadToEnd();
    s = s.Replace('\x0', ' '); // replace NUL bytes with spaces
    Console.WriteLine(s);
}

结果与您在 Notepad 或 Notepad++ 中看到的非常相似。 “有趣的符号”会根据您的控制台配置方式而有所不同,但您明白了。

顺便说一句,如果你在调试器中检查字符串,你会看到完全不同的东西。那些有趣的符号被编码为 C# 字符转义。例如,nul 字节(值 0)将在调试器中显示为 \0,在 Notepad++ 中显示为 NUL,在控制台或记事本中显示为空格。换行符在调试器等中显示为\r

正如我所说,将二进制文件作为文本读取是非常奇特的。除非你只是想看看文件中是否有人类可读的数据,否则我无法想象你为什么要这样做。

更新

我怀疑您在 Windows 窗体 TextBox 中看到的所有内容都是“MZ”的原因是 Windows 文本框控件(这是 TextBox 最终使用的)使用 NUL 字符作为字符串终止符,所以不会t 在第一个 NUL 之后显示任何内容。 “MZ”之后的第一件事是NUL(在调试器中显示为`\0')。您必须将字符串中的 0 替换为空格。我编辑了上面的代码示例,展示了你将如何做到这一点。

【讨论】:

  • 谢谢!但是,如何在 Windows 窗体文本框中获得相同的结果?我尝试了同样的方法,但我仍然得到 MZ。
  • 老兄...!!!我终于可以做我一直想做的事了! - 有趣的事情:如果我在RichTextBox 的中间/底部附近打开一个可执行文件(*.exe),我会找到应用程序源代码的一些部分......我将MozillaFirefox.exe 加载到其中,我找到了this.21TG20.Reloa1621-,它看起来像Reload 按钮的代码!我现在很开心!竖起大拇指,伙计!
【解决方案2】:

exe 是一个二进制文件,如果您尝试将其作为文本文件读取,您将获得您所描述的效果。尝试使用类似 FileStream 的东西,它不关心文件的结构,而是将其视为一系列字节。

【讨论】:

  • 我使用过 StreamReader、FileStream 和 BufferedStream。没有返回我在记事本或记事本++中打开文件时看到的内容
猜你喜欢
  • 2014-01-05
  • 2015-07-27
  • 2018-07-16
  • 1970-01-01
  • 2016-11-11
  • 2016-08-02
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多