在以编程方式将压缩方法应用于数据时,我一直在讨论这个问题。我已经搜索了很多关于这个问题的网站,但是似乎没有一个网站对我有帮助。
关于我的最新发现,我有:简单对象到byte[] & byte[]到对象方法(我更喜欢这些) & 一个更复杂的类扩展
它们似乎都压缩得很好,但在解压缩过程中却抛出一个错误。
我的目标: ->压缩并将内存中的数据写入文件.->从文件读取和解压缩数据。
使用它的主程序有一个包含对象的字符串,所有对象都用一个< CARD >标记分隔;每个对象包含6个字符串,图像(转换为string)都用一个< DATA >标记分隔。
我写了一个简单的“测试”程序来做实验,最后申请.这是代码:
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()); }
}(我不太关心虚拟程序的效率-尽管我也尽量不做草率的工作)
我可能做错什么了?
发布于 2011-09-15 23:43:19
您正在尝试将二进制数据存储在文本框中。这可能会在第一个NUL处截断,并可能以其他方式损坏数据(例如,后置字符可能不会被保留)。
如果需要将压缩输出作为文本处理,可以使用Base64或类似的方法。
或者跳过文本框,尝试使用二进制文件。
发布于 2011-09-15 23:49:30
只有当您传递给它的数据实际上是一个编码字符串时,enc.GetString()才能工作。
但在您的示例中,您没有将编码的字符串传递给该方法。您正在传递一个包含压缩步骤输出的字节数组。压缩产生“一串字节”。而且不可能仅仅从这组字节生成一个字符串。
您所做的错误是假设一个字节数组是一个字节数组,您可以在任意字节数组上调用Encoding.GetString()。不是这样的。
正如before所说,在将字节数组显示在文本框中之前,您需要对字节数组进行某种形式的编码。如果要将字节数组转换为可显示字符串,则可以通过十六进制编码步骤或base64或其他方式对其进行编码。
然后,当你想要解压缩时,你必须做相反的事情(解码)。
https://stackoverflow.com/questions/7438498
复制相似问题