【问题标题】:C# - writing bit by bit into binary fileC# - 逐位写入二进制文件
【发布时间】:2015-11-25 05:38:44
【问题描述】:

这是一段旨在在 .txt 文件上使用香农编码的代码。我希望在这里完成的是创建存储编码消息的二进制文件。

codes 数组存储只有 0 和 1 的字符串。 (代码)

数组symbolsSet包含整数值形式的字符。

indexFirstProbability 只是指示我们需要从何处开始读取 symbolSet 的值。

sampleText 是我们要编码的字符串(香农编码是基于它制作的)

我的代码产生了错误的输出。它不是一次将一位写入文件,而是写入两位,其中第一个始终为 0。

例如,如果字母 a 的代码为 00,b 的代码为 110,则消息 aab 的输出文件为:00 00 00 00 01 01 00 而不是 0 0 0 0 1 1 0(为便于阅读增加了间距)。

如果有人向我解释为什么我的代码会这样工作以及如何修复它,我将不胜感激。

static void saveMessageIntoBinaryFile (string[] codes, int[] symbolSet, 
            int indexFirstProbability, string sampleText, string fileName, string path)
{
    BinaryWriter binaryWriter = new BinaryWriter(File.Open( path + fileName + ".bin", FileMode.Create));

    string temp;
    bool oneOrZero;

    foreach (char s in sampleText)
    {
        temp = codes[Array.IndexOf(symbolSet, s) - indexFirstProbability];

        foreach (char b in temp)
        {
            if (b == '0')
                oneOrZero = false;
            else  
                oneOrZero = true;

            binaryWriter.Write(oneOrZero);
        }

    }
    binaryWriter.Close();
}

【问题讨论】:

  • 你知道 BinaryWriter.Write 需要一个字节吗?一个字节有八位......所以你的实现是使用一个完整的字节来表示一个位。即浪费 7 位
  • BinaryWriter.Write(bool) 确实只写了一个字节;不是两个。你确定你没有误读十六进制转储吗?在通常的十六进制编辑器符号中,01 表示值为 1 的单个字节。
  • @KiwiPiet 我不知道这一点。我想一点一点地写这个文件。在写这篇文章时,我还混淆了“位”和“字节”的名称......
  • @user5090812 有可能——我今天第一次接触到读取二进制文件,我正在使用 Visual Studio 来做。
  • @user5090812 并非如此。我写了一个解码器 - 它对文件进行解码,就好像它真的包含额外的 0。

标签: c# binaryfiles


【解决方案1】:

我会这样做:

public static void Main()
{
    Console.WriteLine("Hello World");
    SaveMessageIntoBinaryFile(new []{"00", "110"}, new char[]{'a', 'b'}, "aab", "output.txt", "");
}

static void SaveMessageIntoBinaryFile (string[] codes, char[] symbolSet, string sampleText, string fileName, string path)
{
    using(var writer = new StreamWriter(File.Open(Path.Combine(path, fileName), FileMode.Create)))
    {
        foreach(var symbol in sampleText)
        {
            var codeIndex = Array.IndexOf<char>(symbolSet, symbol);
            writer.Write(codes[codeIndex]);
            Console.Write(codes[codeIndex] + "\t");
        }
    }
}

您可以尝试在此处启动它:https://dotnetfiddle.net/Jj27Fu

你真的需要二进制输出吗?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
相关资源
最近更新 更多