我到处寻找这个答案,所以希望它不是重复的。我决定我最终会在这里问它。
我有一个名为Program1.exe的文件当我将该文件拖到记事本或Notepad ++中时,我会得到各种随机符号,然后是一些可读文本。但是,当我尝试在C#中读取此文件时,我得到的结果不准确,或者只是一个大的MZ。我已经在C#中尝试了所有支持的编码。记事本程序如何读取这样的文件,但我根本不能?我尝试将字节转换为字符串,但它不起作用。我尝试逐行直接读取它不起作用。我甚至尝试过二进制文件,它不起作用。
感谢您的帮助! :)
答案 0 :(得分:4)
将二进制文件作为文本读取是一件很奇怪的事情,但它是可能的。任何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 ++中看到的结果非常相似。 "有趣的符号"将根据您的控制台的配置方式而有所不同,但您会明白这一点。
顺便说一句,如果你在调试器中检查字符串,你会发现一些完全不同的东西。那些有趣的符号被编码为C#字符转义符。例如,nul字节(值0)将在调试器中显示为\0
,在Notepad ++中显示为NUL
,在控制台或记事本中显示为空格。新行在调试器等中显示为\r
正如我所说,将二进制文件作为文本读取是非常奇怪的。除非你只是想查看文件中是否有人类可读数据,否则我无法想象你为什么要这样做。
我怀疑你在Windows Forms TextBox中看到的所有内容都是" MZ"是Windows文本框控件(这是TextBox最终使用的控件)使用NUL
字符作为字符串终止符,因此不会在第一个NUL
之后显示任何内容。并且" MZ"之后的第一件事是NUL
(在调试器中显示为“\ 0'”)。您必须用空格替换字符串中的0。我编辑了上面的代码示例,展示了你是如何做到的。
答案 1 :(得分:0)
exe是一个二进制文件,如果您尝试将其作为文本文件读取,您将获得您正在描述的效果。尝试使用类似FileStream的东西,而不是关心文件的结构,但只是将其视为一系列字节。