2010-06-05 26 views
6

estoy tratando de leer un archivo binario (por ejemplo, un archivo ejecutable) en una cadena, a continuación, escribir de nuevoarchivo binario a cadena

FileStream fs = new FileStream("C:\\tvin.exe", FileMode.Open); 
BinaryReader br = new BinaryReader(fs); 
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length)); 
System.Text.Encoding enc = System.Text.Encoding.ASCII; 
string myString = enc.GetString(bin); 
fs.Close(); 
br.Close(); 
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
byte[] rebin = encoding.GetBytes(myString); 
FileStream fs2 = new FileStream("C:\\tvout.exe", FileMode.Create); 
BinaryWriter bw = new BinaryWriter(fs2); 
bw.Write(rebin); 
fs2.Close(); 
bw.Close(); 

esto no funciona (el resultado tiene exactamente el mismo tamaño en bytes, pero no se puede ejecutar)

si lo hago bw.Write (bin) el resultado es bueno, pero debe guardarlo en una cadena

+0

hacer una comparación hexagonal, son los bytes en orden inverso? (Little Endian a big endian) – Amirshk

+0

¿Por qué necesita para almacenar como una cadena? –

Respuesta

15

Al decodificar los bytes en una cadena, y les vuelve a codificar de nuevo en bytes, que está perdiendo información. ASCII en particular, es una muy mala elección para este puesto ASCII lanzará una gran cantidad de información sobre la forma, pero corre el riesgo de pérdida de información cuando la codificación y descodificación sin importar el tipo de codificación que elija, lo que no está en el camino correcto .

Lo que necesita es una de las rutinas BaseXX, que codifica los datos binarios en caracteres imprimibles, por lo general para su almacenamiento o transmisión a través de un medio que sólo permite que el texto (correo electrónico y Usenet viene a la mente.)

Ascii85 es una tal algoritmo, y la página contiene enlaces a diferentes implementaciones. Tiene una proporción de 4: 5, lo que significa que 4 bytes se codificarán como 5 caracteres (un aumento del 25% en el tamaño).

Si nada más, ya existe una rutina de codificación Base64 integrada en .NET. Tiene una relación de 3: 4 (un aumento del 33% en el tamaño), aquí:

Esto es lo que su código puede ser similar con estos métodos:

string myString; 
using (FileStream fs = new FileStream("C:\\tvin.exe", FileMode.Open)) 
using (BinaryReader br = new BinaryReader(fs)) 
{ 
    byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length)); 
    myString = Convert.ToBase64String(bin); 
} 

byte[] rebin = Convert.FromBase64String(myString); 
using (FileStream fs2 = new FileStream("C:\\tvout.exe", FileMode.Create)) 
using (BinaryWriter bw = new BinaryWriter(fs2)) 
    bw.Write(rebin); 
2

no creo que se puede representar a todos los bytes con ASCII en de esa manera. Base64 es una alternativa, pero con una relación entre bytes y texto de 3: 4.