2010-06-05 17 views
6

Ich versuche, eine Binär-Datei zu lesen (zum Beispiel einer ausführbaren Datei) in einen String, dannBinärdatei String

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

zurück schreibt dies nicht funktioniert (das Ergebnis hat genau die gleiche Größe in Bytes, aber nicht ausgeführt werden kann)

, wenn ich tun bw.Write (bin) das Ergebnis ist in Ordnung, aber ich muss es in einen String

+0

Machen Sie einen Hex-Vergleich, sind die Bytes in umgekehrter Reihenfolge? (Little Endian zu Big Endian) – Amirshk

+0

Warum müssen Sie es als String speichern? –

Antwort

15

Wenn Sie die Bytes in eine Zeichenfolge decodieren und sie wieder in Bytes umcodieren, verlieren Sie Informationen. Insbesondere ASCII ist eine sehr schlechte Wahl, da ASCII viele Informationen auf den Weg wirft, aber Sie riskieren den Verlust von Informationen beim Kodieren und Dekodieren, unabhängig von der Art der gewählten Kodierung, also sind Sie nicht auf dem richtigen Weg .

Was Sie brauchen, ist eine der BaseXX Routinen codiert, dass Binärdaten in druckbare Zeichen, die typischerweise für die Speicherung oder Übertragung über ein Medium, das nur Text erlaubt (E-Mail und Usenet in den Sinn kommt.)

Ascii85 ist ein solcher Algorithmus, und die Seite enthält Links zu verschiedenen Implementierungen. Es hat ein Verhältnis von 4: 5, was bedeutet, dass 4 Bytes als 5 Zeichen (eine 25% ige Vergrößerung) codiert werden.

Wenn nichts anderes, gibt es bereits eine Base64 Encoding-Routine in .NET eingebaut. Es hat ein Verhältnis von 3: 4 (eine 33% ige Erhöhung der Größe), hier:

Hier ist, was Ihr Code wie mit diesen Methoden aussehen:

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

ich Sie mit ASCII darstellen können alle Bytes nicht denken, speichern in dieser Weg. Base64 ist eine Alternative, aber mit einem Verhältnis zwischen Bytes und Text von 3: 4.