我一直在以编程方式将压缩方法应用于数据这一问题...我已经搜索了很多关于这个主题的网站,但似乎没有人为我做这个技巧。
对于我的最新发现,我有: Simple object to byte[] & byte[] to object methods(I prefer these)& A rather more complex class extension
他们似乎都很好地压缩,但在解压缩期间抛出错误。
我的目标: - >将内存中的数据压缩并写入文件。 - >从文件中读取并解压缩数据。
使用它的主程序有一个字符串,其中包含所有用<分隔的对象。 CARD>标签;每个对象包含六个字符串和一个图像(转换为字符串),所有这些都用<数据>标签
我写了一个简单的'测试'程序,在最终应用之前进行实验......这就是代码:
private void btnCompress_Click(object sender, EventArgs e)
{
try
{
Encoding enc = new UTF32Encoding();
richTextBox1.Text = enc.GetString(CompressionStyle2.Compress(richTextBox1.Text));
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
private void btnDecompress_Click(object sender, EventArgs e)
{
try
{
Encoding enc = new UTF32Encoding();
richTextBox1.Text = (string)CompressionStyle2.Decompress(enc.GetBytes(richTextBox1.Text));
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
(我对虚拟程序的效率并不在意 - 尽管我也不想做一个草率的工作)
我可能做错了什么?
答案 0 :(得分:0)
您正在尝试将二进制数据存储在文本框中。这可能会在第一个NUL处截断,并可能以其他方式破坏数据(例如,可能不会保留退格字符)。
如果需要将压缩输出视为文本,请使用Base64或类似的东西。
或者只是跳过文本框并尝试使用二进制文件。
答案 1 :(得分:0)
enc.GetString()
仅在传递给它的数据时才有效,它实际上是一个编码字符串。
但是在你的情况下,你没有将编码的字符串传递给该方法。您正在传递包含压缩步骤输出的字节数组。压缩产生“一堆字节”。并且不可能只从该组字节生成一个字符串。
你做错了是假设一个字节数组是一个字节数组,你可以在你喜欢的任何字节数组上调用Encoding.GetString()
。它不起作用。
正如Ben Voigt所说,你需要以某种形式对字节数组进行编码,然后才能在文本框中显示它。如果要将字节数组转换为可显示的字符串,请通过十六进制编码步骤或base64或其他方式对其进行编码。
然后,当你想要解压缩时,你必须做反向(解码)。