来自exe文件的二进制读取数据

时间:2015-11-11 08:02:34

标签: c#

我想从exe文件中读取数据。 在java上我从头到尾阅读exe完美, 在c#上发髻我无法读取所有文件。 文件lenth为true但结果只显示exe文件头

string fileLoc = filePaths[0];
FileStream fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryReader br = new BinaryReader(fs);
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
  foreach(byte b in bin){
   Console.Write((char)b);
                }
fs.Close();

输出只是exe的头:MZP

1 个答案:

答案 0 :(得分:1)

无法重现:

        string fileLoc = //my path to git.exe
        FileStream fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read);
        BinaryReader br = new BinaryReader(fs);
        byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
        foreach (byte b in bin)
        {
            Console.Write((char)b);
        }
        fs.Close()

它会写入所有数据。

但我在你的代码中看到很多问题:

1)永远不要使用这种不太好的方式处理文件(如果错误发生的文件不会关闭)重写:

       string fileLoc = //my path to git.exe
        using(FileStream fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read)) {
        BinaryReader br = new BinaryReader(fs);
        byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
        foreach (byte b in bin)
        {
            Console.Write((char)b);
        }
       } // no more explicit close required, but it will closed with guarantee

2)没有错误,但在C#中,最好使用var(在c ++中分析为auto)

       using(var fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read)) {
        var br = new BinaryReader(fs);
        var  bin = br.ReadBytes(Convert.ToInt32(fs.Length));
        foreach (var b in bin)
        {
            Console.Write((char)b);
        }
       } //it still strong typed, but type referenced only once at right side of assigment

3)不需要使用转换为显式可转换类型(long-> int)

   var  bin = br.ReadBytes((int)fs.Length);

4)我不知道为什么只有MZP是在你的情况下编写的,但可以想象如果你将字节转换为char你会得到许多不可打印的符号,包括输出中的\ r \ n \ f等等 - 您的混凝土终端将如何反应? - 我不知道

5)如果你打印(char)b只是为了测试bin - 为什么这么糟糕 - 为什么你不能简单地测试bin.Length或为什么你打印(char)b而不是b+" " ?否则,如果你真的想将字节打印到控制台 - 无论如何这都是坏主意 - 看看(4)

6)为什么选择BinaryReader?如果你只想阅读全部

       using(var fs = new FileStream(fileLoc, FileMode.Open, FileAccess.Read, FileShare.Read)) {
        var bin = new byte[(int)fs.Length];
        // u can use usual  stream pattern 
        int l=0; while((l+=fs.Read(bin,t,bin.Length-t))<bin.Length);
        foreach (var b in bin)
        {
            Console.Write((char)b);
        }
       }