2010-06-05 16 views
6

sto cercando di leggere un file binario (ad esempio un file eseguibile) in una stringa, quindi scrivere indietrofile binario a stringa

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(); 

questo non funziona (il risultato ha esattamente le stesse dimensioni in byte, ma non può essere eseguito)

se faccio bw.Write (bin) il risultato è ok, ma devo salvarlo in una stringa

+0

Fare un confronto di esagono, i byte sono nell'ordine inverso? (little endian to big endian) – Amirshk

+0

Perché è necessario archiviarlo come stringa? –

risposta

15

Quando decodificate i byte in una stringa e li ricodificati nuovamente in byte, perdete informazioni. L'ASCII in particolare è una scelta molto brutta per questo dato che ASCII getterà molte informazioni sulla strada, ma rischi di perdere informazioni durante la codifica e la decodifica indipendentemente dal tipo di Encoding che scegli, quindi non sei sulla strada giusta .

Quello che vi serve è una delle routine basexx, che codifica i dati binari a caratteri stampabili, in genere per la conservazione o la trasmissione su un mezzo che consente solo il testo (e-mail e usenet viene in mente.)

Ascii85 è uno tale algoritmo e la pagina contiene collegamenti a diverse implementazioni. Ha un rapporto di 4: 5 che significa che 4 byte saranno codificati come 5 caratteri (aumento del 25%.)

Se non altro, esiste già una routine di codifica Base64 integrata in .NET. Ha un rapporto di 3: 4 (un aumento del 33% in termini di dimensioni), qui:

Ecco ciò che il codice può essere simile con questi metodi:

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

non credo che si può rappresentare tutti i byte con ASCII in quel modo. Base64 è un'alternativa, ma con un rapporto tra byte e testo di 3: 4.