【发布时间】:2017-04-27 16:38:22
【问题描述】:
这是我在这里遇到的一个奇怪的问题。我正在.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
从中间形式的转换返回完全相同的字符串。
二进制
输出目前,我正在尝试将二进制文件直接写为字节,例如:
List<Byte> bytes = new List<byte>();
foreach(char c in binary)
bytes.Add(Convert.ToByte(c));
File.WriteAllBytes(filename, bytes.ToArray());
问题
我现在尝试的二进制输出方法只是将二进制文件直接写入文本文件,而不是将二进制对象写入文件系统。
我们正在压缩图片、可执行文件、文本、git 对象等。所以这样写显然是不可行的。
在 C#/.NET 中是否存在一种方法可以轻松地将二进制文件转换回文件,或者这是一个比我想象的更复杂的问题?
【问题讨论】:
-
为什么您首先要将二进制数据转换为字符串,而不是仅将数据作为字节处理?
-
^^见上面的评论
-
二进制数据通常具有与数据相关的格式。您只是无法读取或写入数据。例如,如果你写一个 32 位整数,两个 8 位字节。当您阅读时,您必须阅读相同大小的数据。因此,当您编写二进制文件时,您必须以完全相同的方式将其读回。
-
我建议你重写所有处理“二进制字符串”的代码来处理原始字节。我想这会带来巨大的性能提升。
-
由于压缩本身的工作方式,算法不可能处理字节而不是字符串,至少在输出方面是这样。将其存储为文本是该算法的一个组成部分。那么,要让算法可行就完全站不住脚了?
标签: c# .net io binary filesystems