двоичный файл для строкового представления

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

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. Запишите (мусорное ведро), результат в порядке, но я должен сохранить его к строке

7
задан John Saunders 5 June 2010 в 12:08
поделиться

2 ответа

Когда вы декодируете байты в строку и снова кодируете их в байты, вы теряете информацию. 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);
18
ответ дан 6 December 2019 в 09:18
поделиться

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

2
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: