2010-06-05 81 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。