【发布时间】: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