这是一段旨在在.txt文件上使用香农编码的代码。我希望在这里完成的是创建存储编码消息的二进制文件。
数组代码存储只有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();
}
答案 0 :(得分:0)
我会这样做:
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
你真的需要二进制输出吗?