fichier binary en chaîne

J’essaie de lire un fichier binary (par exemple, un exécutable) dans une chaîne, puis de l’écrire.

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; ssortingng mySsortingng = enc.GetSsortingng(bin); fs.Close(); br.Close(); System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); byte[] rebin = encoding.GetBytes(mySsortingng); 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 en octets mais ne peut pas être exécuté)

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

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 émettra beaucoup d’informations sur le chemin mais vous risquez de perdre des informations lors de l’encodage et du décodage quel que soit le type d’Encodage choisi, vous n’êtes donc pas sur la bonne voie. .

Ce dont vous avez besoin est l’une des routines BaseXX, qui code les données binarys en caractères imprimables, généralement pour le stockage ou la transmission sur un support ne permettant que le texte (e-mail et usenet me viennent à l’esprit).

Ascii85 est l’un de ces algorithmes 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 en tant que 5 caractères (une augmentation de 25% de la taille).

Si rien d’autre, il existe déjà une routine d’encodage Base64 intégrée à .NET. Il a un ratio de 3: 4 (une augmentation de 33%), ici:

  • Méthode Convert.ToBase64Ssortingng
  • Méthode Convert.FromBase64Ssortingng

Voici à quoi peut ressembler votre code avec ces méthodes:

 ssortingng mySsortingng; using (FileStream fs = new FileStream("C:\\tvin.exe", FileMode.Open)) using (BinaryReader br = new BinaryReader(fs)) { byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length)); mySsortingng = Convert.ToBase64Ssortingng(bin); } byte[] rebin = Convert.FromBase64Ssortingng(mySsortingng); using (FileStream fs2 = new FileStream("C:\\tvout.exe", FileMode.Create)) using (BinaryWriter bw = new BinaryWriter(fs2)) bw.Write(rebin); 

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