2010-06-05 10 views
6

je suis en train de lire un fichier binaire (par exemple un exécutable) dans une chaîne, puis l'écrire retourfichier binaire à chaîne

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

cela ne fonctionne pas (le résultat a exactement la même taille octets mais ne peut pas exécuter)

si je fais bw.Write (bin) le résultat est correct, mais je dois enregistrer une chaîne

+0

Faire une comparaison hexadécimale, les octets sont-ils dans l'ordre inverse? (peu endian à big endian) – Amirshk

+0

Pourquoi avez-vous besoin de le stocker comme une chaîne? –

Répondre

15

Lorsque vous décodez les octets en une chaîne et que vous les réencodez en octets, vous perdez des informations. ASCII en particulier est un très mauvais choix car ASCII va lancer beaucoup d'informations sur le chemin, mais vous risquez de perdre des informations lors du codage et du décodage quel que soit le type d'encodage choisi, donc vous n'êtes pas sur la bonne voie .

Qu'est-ce que vous avez besoin est une des routines BaseXX, qui encode les données binaires à des caractères imprimables, généralement pour le stockage ou la transmission sur un support qui permet uniquement le texte (e-mail et usenet vient à l'esprit.)

Ascii85 est un un tel algorithme, et la page contient des liens vers différentes implémentations. Il a un rapport de 4: 5 ce qui signifie que 4 octets seront codés comme 5 caractères (une augmentation de 25%.)

Si rien d'autre, il existe déjà une routine de codage Base64 intégrée dans .NET. Il a un rapport de 3: 4 (a taille hausse de 33%), ici:

Voici ce que votre code peut ressembler à ces méthodes:

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

Je ne pense pas que vous pouvez représenter tous les octets avec ASCII de cette façon. Base64 est une alternative, mais avec un ratio entre les octets et le texte de 3: 4.