2010-06-05 77 views
6

我試圖讀取二進制文件(例如一個可執行文件)轉換成字符串,然後把它寫回二進制文件字符串

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)的結果是正確的,但我必須將它保存爲一個字符串

+0

做一個十六進制比較,是逆序的字節? (小端到大端) – Amirshk 2010-06-05 11:49:10

+0

爲什麼你需要將它存儲爲字符串? – 2010-06-05 12:09:35

回答

15

當您將字節解碼爲字符串並將其重新編碼爲字節時,您將丟失信息。特別是對於ASCII來說,這是一個非常糟糕的選擇,因爲ASCII會在路上扔掉很多信息,但是無論選擇哪種編碼類型,編碼和解碼都會導致信息丟失,所以你不在正確的道路上。

你需要的是BaseXX例程之一,二進制數據編碼到可打印字符,通常用於存儲或傳輸通過一個介質,只允許文本(電子郵件,新聞組浮現在腦海。)

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

我不認爲你可以表示與ASCII中的所有字節那樣。 Base64是一種替代方案,但字節與文本比例爲3:4。