在程序中压缩/解压缩

时间:2011-09-15 23:10:39

标签: c# file stream compression

我一直在以编程方式将压缩方法应用于数据这一问题...我已经搜索了很多关于这个主题的网站,但似乎没有人为我做这个技巧。

对于我的最新发现,我有: 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()); }
    }

(我对虚拟程序的效率并不在意 - 尽管我也不想做一个草率的工作)

我可能做错了什么?

2 个答案:

答案 0 :(得分:0)

您正在尝试将二进制数据存储在文本框中。这可能会在第一个NUL处截断,并可能以其他方式破坏数据(例如,可能不会保留退格字符)。

如果需要将压缩输出视为文本,请使用Base64或类似的东西。

或者只是跳过文本框并尝试使用二进制文件。

答案 1 :(得分:0)

enc.GetString()仅在传递给它的数据时才有效,它实际上是一个编码字符串。

但是在你的情况下,你没有将编码的字符串传递给该方法。您正在传递包含压缩步骤输出的字节数组。压缩产生“一堆字节”。并且不可能只从该组字节生成一个字符串。

你做错了是假设一个字节数组是一个字节数组,你可以在你喜欢的任何字节数组上调用Encoding.GetString()。它不起作用。

正如Ben Voigt所说,你需要以某种形式对字节数组进行编码,然后才能在文本框中显示它。如果要将字节数组转换为可显示的字符串,请通过十六进制编码步骤或base64或其他方式对其进行编码。

然后,当你想要解压缩时,你必须做反向(解码)。