压缩/解压撰写

本文关键字:压缩 | 更新日期: 2023-09-27 18:08:38

我一直在讨论这个问题,以编程方式将压缩方法应用于数据…我已经搜索并访问了许多关于这个主题的网站,但似乎没有一个适合我。

对于我的最新发现,我有:简单对象到byte[] &byte[]到对象方法(我更喜欢这些)&更复杂的类扩展

它们似乎都压缩得很好,但在解压时抛出错误。

我的目标:→压缩内存中的数据并将其写入文件。→从文件中读取并解压缩数据

要使用它的主程序有一个字符串,包含所有用&lt分隔的对象;卡比;标签;每个对象包含六个字符串和一个图像(转换为字符串),它们用<数据比;标签。>

我写了一个简单的"测试"程序来实验,最后申请…这是代码:

    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()); }
    }

(我不太关心伪程序的效率——尽管我也尽量不做草率的工作)

我可能做错了什么?

压缩/解压撰写

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

如果需要将压缩后的输出作为文本处理,请使用Base64或类似的格式。

或者直接跳过文本框,尝试使用二进制文件

enc.GetString()仅在您传递给它的数据确实是编码字符串时才工作。

但是在您的示例中,您没有将编码字符串传递给该方法。您正在传递一个包含压缩步骤输出的字节数组。压缩产生"一堆字节"。而且不可能从那组字节中生成一个字符串。

你做错的是假设一个字节数组是一个字节数组,你可以在任何你喜欢的字节数组上调用Encoding.GetString()。事情不是这样的。

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

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