2010-06-05 16 views
6

próbuję odczytać plik binarny (na przykład plik wykonywalny) na ciąg znaków, a następnie zapisać go z powrotemplik binarny ciąg

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

to nie działa (wynik ma dokładnie ten sam rozmiar w bajty, ale nie można uruchomić)

jeśli zrobić bw.Write (bin) wynik jest ok, ale muszę go zapisać na ciąg

+0

Czy porównanie heksadecymalne, to bajty w odwrotnej kolejności? (little endian to big endian) – Amirshk

+0

Dlaczego musisz przechowywać go jako ciąg? –

Odpowiedz

15

Po dekodowaniu bajtów w ciągu znaków i ponownym zakodowaniu ich z powrotem do bajtów, tracisz informacje. Zwłaszcza ASCII jest bardzo złym wyborem, ponieważ ASCII będzie wyrzucać wiele informacji po drodze, ale ryzykujesz utratę informacji podczas kodowania i dekodowania, niezależnie od wybranego rodzaju kodowania, więc nie jesteś na właściwej ścieżce .

Co trzeba to jedna z procedur BaseXX, który koduje dane binarne do druku znaków, zwykle do przechowywania lub transmisji przez medium, które pozwala jedynie tekst (e-mail oraz Usenet przychodzi do głowy.)

Ascii85 jest jednym taki algorytm, a strona zawiera linki do różnych implementacji. Ma stosunek 4: 5, co oznacza, że ​​4 bajty zostaną zakodowane jako 5 znaków (wzrost o 25%).

Jeśli już nic nie ma, to wbudowana w .NET procedura kodowania Base64. Ma stosunek 3: 4 (wzrost o 33% w rozmiarze), tutaj:

Oto co kod może wyglądać z tych metod:

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

nie sądzę, że można reprezentować wszystkich bajtów z ASCII w ten sposób. Base64 jest alternatywą, ale ma stosunek między bajtami a tekstem 3: 4.