2010-03-11 76 views
21

我想創建一個方法,它接受任何文件並將其作爲0和1的數組(即其二進制代碼)讀取。我想將該二進制代碼保存爲文本文件。你可以幫我嗎?謝謝。如何在C#中讀取二進制文件?

+0

你的問題還不清楚。這兩個文件應該是什麼樣子? – SLaks 2010-03-11 15:29:42

+0

我想他想將文件的位模式存儲到文本文件中。 – Oded 2010-03-11 15:32:30

+0

源文件是二進制編碼還是編碼(文本,如ASCII,UTF-8,UTF-16等)?換句話說,如果你在記事本這樣的文本編輯器中打開文件,你會看到零和那個? – Pat 2010-03-11 15:55:01

回答

40

快速和髒版打印:

byte[] fileBytes = File.ReadAllBytes(inputFilename); 
StringBuilder sb = new StringBuilder(); 

foreach(byte b in fileBytes) 
{ 
    sb.Append(Convert.ToString(b, 2).PadLeft(8, '0')); 
} 

File.WriteAllText(outputFilename, sb.ToString()); 
+1

@Andrey:請參閱「快速和骯髒」。顯然,在生產中,使用文件流的東西會更好。重要的部分是從字節轉換爲二進制字符串。 – 2010-03-11 17:42:41

12

那麼,讀它並不難,只需使用FileStream來讀取一個字節[]。除非將1和0轉換爲十六進制,否則將其轉換爲文本通常不是可能的或有意義的。使用BitConverter.ToString(byte [])過載很容易。您通常希望在每行中轉儲16或32個字節。您可以使用Encoding.ASCII.GetString()嘗試將字節轉換爲字符。做這個樣例程序:

using System; 
using System.IO; 
using System.Text; 

class Program { 
    static void Main(string[] args) { 
     // Read the file into <bits> 
     var fs = new FileStream(@"c:\temp\test.bin", FileMode.Open); 
     var len = (int)fs.Length; 
     var bits = new byte[len]; 
     fs.Read(bits, 0, len); 
     // Dump 16 bytes per line 
     for (int ix = 0; ix < len; ix += 16) { 
      var cnt = Math.Min(16, len - ix); 
      var line = new byte[cnt]; 
      Array.Copy(bits, ix, line, 0, cnt); 
      // Write address + hex + ascii 
      Console.Write("{0:X6} ", ix); 
      Console.Write(BitConverter.ToString(line)); 
      Console.Write(" "); 
      // Convert non-ascii characters to . 
      for (int jx = 0; jx < cnt; ++jx) 
       if (line[jx] < 0x20 || line[jx] > 0x7f) line[jx] = (byte)'.'; 
      Console.WriteLine(Encoding.ASCII.GetString(line)); 
     } 
     Console.ReadLine(); 
    } 
} 
+0

謝謝你的回答。嗯..事情似乎並不奏效,因爲我沒有得到0和1。相反,我得到的效果與我選擇在記事本中打開文件的效果相同。 – Boris 2010-03-11 16:18:43

+0

是的,他們是用十六進制編碼的。你在記事本中看到的不一樣。 Backgrounder:http://en.wikipedia.org/wiki/Hexadecimal – 2010-03-11 16:28:13

+0

這種方法讀取文件,你能否提供一種方法,將二進制文件寫入文件或將二進制數據寫入文件,然後轉換爲十六進制以回讀你有這種方式嗎? – shawn 2014-12-11 16:53:39

3

使用簡單FileStream.Read然後用Convert.ToString(b, 2)

+0

謝謝你的回答。 – Boris 2010-03-11 16:19:13