二进制文件到字符串

时间:2010-06-05 11:43:51

标签: c# string binaryfiles

我正在尝试将二进制文件(例如可执行文件)读入字符串,然后将其写回来

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 个答案:

答案 0 :(得分:16)

当您将字节解码为字符串并将其重新编码为字节时,您将丢失信息。特别是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);

答案 1 :(得分:2)

我认为你不能以这种方式用ASCII表示所有字节。 Base64是一种替代方案,但字节和文本之间的比例为3:4。