【问题标题】:Can I write binary stored as a string to a binary file directly in C#?我可以直接在 C# 中将存储为字符串的二进制文件写入二进制文件吗?
【发布时间】: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


【解决方案1】:

一个字节中有 8 位,但您尝试一次将 1 位转换为一个字节。您需要先收集 8 位,然后使用接受 fromBaseConvert.ToByte() 重载将其转换为字节:

替换此代码:

// 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2015-07-02
    • 2016-01-15
    • 2021-10-27
    • 2017-06-06
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多