двоичный файл в строку - PullRequest
6 голосов
/ 05 июня 2010

Я пытаюсь прочитать двоичный файл (например, исполняемый файл) в строку, а затем записать его обратно

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

это не работает (результат имеет точно такой же размер в байтах, но не может работать)

если я делаю bw.Write (bin), результат в порядке, но я должен сохранить его в строку

Ответы [ 2 ]

16 голосов
/ 05 июня 2010

Когда вы декодируете байты в строку и перекодируете их обратно в байты, вы теряете информацию. ASCII, в частности, является очень плохим выбором для этого, поскольку ASCII будет выбрасывать много информации по пути, но вы рискуете потерять информацию при кодировании и декодировании независимо от типа выбранной вами кодировки, поэтому вы не на правильном пути .

Вам нужна одна из подпрограмм BaseXX, которая кодирует двоичные данные в печатные символы, обычно для хранения или передачи по носителю, который допускает только текст (приходит на ум электронная почта и usenet).

Ascii85 является одним из таких алгоритмов, и страница содержит ссылки на различные реализации. Соотношение 4: 5 означает, что 4 байта будут закодированы как 5 символов (увеличение на 25%.)

Если ничего другого, в .NET уже встроена подпрограмма кодирования Base64 . Соотношение 3: 4 (увеличение на 33%), здесь:

Вот как ваш код может выглядеть этими методами:

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 голосов
/ 05 июня 2010

Я не думаю, что вы можете представить все байты в ASCII таким образом. Base64 является альтернативой, но с соотношением байтов и текста 3: 4.

...