C#读取文件和编码问题

C#读取文件和编码问题,c#,encoding,binary,byte,C#,Encoding,Binary,Byte,我到处寻找这个答案,希望不是重复的。我决定在这里问这个问题 我有一个名为Program1.exe的文件,当我将该文件拖到记事本或记事本++中时,会得到各种随机符号,然后是一些可读文本。然而,当我试图用C#读取这个文件时,我要么得到不准确的结果,要么只是一个大的MZ。我已经用C#尝试了所有受支持的编码。记事本程序怎么能读取这样的文件,而我却不能?我尝试将字节转换为字符串,但它不起作用。我试着一行一行地直接读,但没有用。我甚至试过二进制,但它不起作用 谢谢你的帮助!:) exe是一个二进制文件,如果

我到处寻找这个答案,希望不是重复的。我决定在这里问这个问题

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


谢谢你的帮助!:)

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

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

将二进制文件作为文本读取是一件很奇怪的事情,但这是可能的。任何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);
}
结果与您在记事本或记事本++中看到的非常相似。“有趣的符号”将根据您的控制台配置的不同而有所不同,但您知道这一点

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

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

使现代化
我怀疑您在Windows窗体文本框中看到的都是“MZ”的原因是Windows文本框控件(文本框最终使用的控件)使用
NUL
字符作为字符串终止符,因此在第一个
NUL
之后不会显示任何内容。“MZ”之后的第一件事是
NUL
(在调试器中显示为“\0”)。您必须用空格替换字符串中的0。我编辑了上面的代码示例,演示了如何执行此操作。

将二进制文件作为文本读取是一件很奇怪的事情,但这是可能的。任何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);
}
结果与您在记事本或记事本++中看到的非常相似。“有趣的符号”将根据您的控制台配置的不同而有所不同,但您知道这一点

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

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

使现代化
我怀疑您在Windows窗体文本框中看到的都是“MZ”的原因是Windows文本框控件(文本框最终使用的控件)使用
NUL
字符作为字符串终止符,因此在第一个
NUL
之后不会显示任何内容。“MZ”之后的第一件事是
NUL
(在调试器中显示为“\0”)。您必须用空格替换字符串中的0。我编辑了上面的代码示例,演示了如何执行此操作。

您使用什么类来阅读它?有什么样的代码可以看吗?你用什么类来阅读?有什么示例代码要看吗?我使用过StreamReader、FileStream和BufferedStream。None返回我在Notepad或Notepad++中打开文件时看到的内容。我使用了StreamReader、FileStream和BufferedStream。无返回我在记事本或记事本++中打开文件时看到的内容谢谢!但是,如何在windows窗体文本框中获得相同的结果?我也试过,但我还是得到了MZ。老兄。。。!!!我终于可以做我一直想做的事了有趣的是:如果我打开一个可执行文件(*.exe),在
RichTextBox
的中间/底部附近,我会找到应用程序的源代码。。。我将
MozillaFirefox.exe
加载到其中,发现
这个.21TG20.Reloa1621-
,它看起来像是
Reload
按钮的代码!我现在很开心!竖起大拇指,伙计!谢谢但是,如何在windows窗体文本框中获得相同的结果?我也试过,但我还是得到了MZ。老兄。。。!!!我终于可以做我一直想做的事了有趣的是:如果我打开一个可执行文件(*.exe),在
RichTextBox
的中间/底部附近,我会找到应用程序的源代码。。。我将
MozillaFirefox.exe
加载到其中,发现
这个.21TG20.Reloa1621-
,它看起来像是
Reload
按钮的代码!我现在很开心!竖起大拇指,伙计!