2010-03-11 60 views
21

Quiero hacer un método que tome cualquier archivo y lo lea como una matriz de 0 y 1, es decir, su código binario. Quiero guardar ese código binario como un archivo de texto. ¿Me puedes ayudar? Gracias.¿Cómo leer el archivo binario en C#?

+0

Su pregunta no es clara. ¿Cómo deberían ser exactamente los dos archivos? – SLaks

+0

Creo que quiere almacenar el patrón de bits de un archivo en un archivo de texto. – Oded

+0

¿El archivo de origen es binario o está codificado (textual, ya sea como ASCII, UTF-8, UTF-16, etc.)? En otras palabras, si abre el archivo en un editor de texto como el Bloc de notas, ¿ve ceros y unos? – Pat

Respuesta

40

versión rápida y sucia:

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: ver "rápido y sucio". Obviamente, en producción, algo que use flujos de archivos sería mucho mejor. La parte importante es la conversión de bytes a cadenas binarias. –

12

Bueno, leerlo no es difícil, solo use FileStream para leer un byte []. Convertirlo en texto no es realmente posible o significativo a menos que convierta los 1 y 0 a hex. Eso es fácil de hacer con la sobrecarga BitConverter.ToString (byte []). En general, desearía volcar 16 o 32 bytes en cada línea. Puede usar Encoding.ASCII.GetString() para tratar de convertir los bytes a caracteres. Un ejemplo de programa que hace esto:

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

Gracias por su respuesta. Hmmm ... algo no parece funcionar, ya que no estoy recibiendo los 0s y 1s. En cambio, obtengo el mismo efecto que si quisiera abrir un archivo en el bloc de notas. – Boris

+0

Sí lo haces, están codificados en hexadecimal. No es lo mismo que verías en el bloc de notas. Información general: http://en.wikipedia.org/wiki/Hexadecimal –

+0

Este método lee el archivo, ¿puede proporcionar un método que escriba el binario en el archivo o escriba los datos binarios en el archivo y luego los convierta en hexadecimal para volver a leer el ¿De qué manera lo tienes aquí? – shawn

4

Usted puede utilizar BinaryReader para leer cada uno de los bytes, a continuación, utilizar BitConverter.ToString(byte[]) para descubrir cómo cada uno está representado en binario.

Puede utilizar esta representación y write en un archivo.

+0

Gracias por su respuesta. – Boris

3

uso sencillo FileStream.Read luego imprimirlo con Convert.ToString(b, 2)

+0

Gracias por su respuesta. – Boris

Cuestiones relacionadas