2010-03-11 13 views
21

Voglio fare un metodo che prende qualsiasi file e lo legge come una matrice di 0 e 1, cioè il suo codice binario. Voglio salvare quel codice binario come un file di testo. Mi potete aiutare? Grazie.Come leggere il file binario in C#?

+0

La tua domanda non è chiara. Come dovrebbero essere esattamente i due file? – SLaks

+0

Penso che voglia archiviare lo schema di bit di un file in un file di testo. – Oded

+0

Il file sorgente è binario o codificato (testuale, sia come ASCII, UTF-8, UTF-16, ecc.)? In altre parole, se apri il file in un editor di testo come Blocco note, vedi degli zeri e uno? – Pat

risposta

40

versione veloce e sporco:

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: vedere "veloce e sporco". Ovviamente, in produzione, qualcosa che utilizza i flussi di file sarebbe molto meglio. La parte importante è la conversione da byte a stringhe binarie. –

12

Bene, la lettura non è difficile, basta usare FileStream per leggere un byte []. La conversione in testo non è in genere possibile o significativa a meno che non converti gli 1 e gli 0 in esadecimale. È facile farlo con l'overload BitConverter.ToString (byte []). In genere si desidera eseguire il dump di 16 o 32 byte in ogni riga. È possibile utilizzare Encoding.ASCII.GetString() per provare a convertire i byte in caratteri. Un esempio di programma che fa questo:

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

Grazie per la risposta. Hmmm .. qualcosa non sembra funzionare, dato che non sto ottenendo lo 0 e l'1. Invece, sto ottenendo lo stesso effetto come se avessi scelto di aprire un file nel blocco note. – Boris

+0

Sì, lo sono, sono codificati in esadecimale. Non è la stessa cosa che vedresti nel blocco note. Backgrounder: http://en.wikipedia.org/wiki/Hexadecimal –

+0

Questo metodo legge il file, puoi fornire un metodo che scrive il file binario nel file o scrive i dati binari nel file, quindi converte in esadecimale per rileggere il file come lo hai qui? – shawn

4

È possibile utilizzare BinaryReader per leggere ciascuno dei byte, quindi utilizzare BitConverter.ToString(byte[]) per scoprire come ciascuno è rappresentato in binario.

È quindi possibile utilizzare questa rappresentazione e write in un file.

+0

Grazie per la risposta. – Boris

3

Utilizzo semplice FileStream.Read quindi stampare con Convert.ToString(b, 2)

+0

Grazie per la risposta. – Boris

Problemi correlati