我可以直接在C#中将存储为字符串的二进制文件写入二进制文件吗?

时间:2016-12-12 18:27:37

标签: c# .net io binary filesystems

这是我在这里遇到的一个奇怪的问题。我使用二进制压缩算法在.NET平台上使用C#6。压缩的多个阶段工作得很好,甚至远远好于预期!但是,将未经优化的二进制文件转换回文件比我预期的要困难得多。

案例

正在从任意文件中读取二进制文件,并在程序中作为字符串传递。多个优化波对字符串起作用,将其转换为中间表示,该表示被写为压缩对象。然后,去优化将中间形式转换回纯二进制,准备写入。

代码

二进制输入

BinaryString = "";  Filename = filename;
StringBuilder sb = new StringBuilder();
foreach(byte b in File.ReadAllBytes(filename)) {
{
   sb.Append(Convert.ToString(b, 2).PadLeft(8, '0'));  
}
BinaryString = sb.ToString();

这就是我接受输入的方式。它将以11001010110001

的形式返回文字二进制字符串

从intermeidate形式转换完全相同的字符串。

二进制

输出目前,我试图直接将二进制文件写为字节,如下:

List<Byte> bytes = new List<byte>();
foreach(char c in binary)
   bytes.Add(Convert.ToByte(c));
File.WriteAllBytes(filename, bytes.ToArray());

问题

我现在尝试二进制输出的方法只是将二进制文件直接写入文本文件,而不是将二进制对象写入文件系统。

我们正在压缩图片,可执行文件,文本,git对象等。因此,将它写成这样的显然是不可行的。

在C#/ .NET中是否存在一种方法,可以让我轻松地将二进制文件翻译回文件,或者这是一个比我想的更复杂的问题?

1 个答案:

答案 0 :(得分:2)

一个字节中有8位,但您尝试一次将1位转换为一个字节。您需要先收集8位,然后使用接受fromBase的{​​{3}}重载将其转换为字节:

替换此代码:

// Note: I assume you meant to reference `BinaryString` here
// and not "binary" which isn't defined in your example
foreach(char c in BinaryString)
   bytes.Add(Convert.ToByte(c));

有了这个:

var thisByte = string.Empty;
foreach (char c in BinaryString)
{
    thisByte += c;
    if (thisByte.Length == 8)
    {
        bytes.Add(Convert.ToByte(thisByte, 2));
        thisByte = string.Empty;
    }
}