【问题标题】:GZipStream makes my text bigger than originalGZipStream 使我的文本比原始文本更大
【发布时间】:2016-11-10 16:45:13
【问题描述】:

这里有一个帖子Compress and decompress string in c# 用于在 c# 中压缩字符串。

我自己实现了相同的代码,但返回的文本几乎是我的两倍:O

我已经在大小为 87 的 json 上尝试过,如下所示:

{"G":"82f88ff5-4143-46ef-86cc-a19910f4a6b5","U":"df39e3c7-ffd3-4829-a9cd-27bfcbd4403a"}

结果是168

H4sIAAAAAAAEAC2NUQ6DIBQE5yx8l0QFqfQCnqAHqKCXaHr3jsaQ3TyYfcuXwKpeamHi0Bf9YCaSGVW6psLua5QWmifykVbPyCDJ3gube4GHet+tXZZM7Xrj6d7Z3u/W8896dVAAAVpd5rMbCaa3k1k25AD8=w8896dVAAAVpd5rMbCaa3k1k25AD8

我已将 Unicode 更改为 ASCII,但结果仍然太大 (128)

H4sIAAAAAAAEAA3KyxGAMAgFwF44y0w+JAEbsAILICSvCcfedc/70ENaYEq0FiyVJa+wdoj2LNZThDvs9FB918Xqu0ag4H1Vy3GbrG4jImYSyRVp/cDp8EZE1cAAAA=

public static string Compress(this string s)
{
    var bytes = Encoding.ASCII.GetBytes(s);
    using (var msi = new MemoryStream(bytes))
    using (var mso = new MemoryStream())
    {
        using (var gs = new GZipStream(mso, CompressionMode.Compress))
        {
           msi.CopyTo(gs);

        }
        return Convert.ToBase64String(mso.ToArray());
    }
}

【问题讨论】:

  • 在转换为Base64之前你有没有比较过字节数?如果我没记错的话,Base64 将每个 6 位块转换为字符 en.wikipedia.org/wiki/Base64
  • @KMoussa 感谢您的回复。我已经添加了我的代码
  • 是的,我使用的是 ToBase64,但我也测试过 System.Text.Encoding.ASCII.GetString(byteArray);
  • bytes.Length 和 mso.ToArray().Length 的值是多少?
  • @KMoussa 是 95 :|

标签: c# string compression


【解决方案1】:

Gzip 不仅是压缩,而且是一种完整的文件格式 - 这意味着它添加了额外的结构,这些结构通常可以忽略它们的大小。 但是,如果压缩小字符串,它们可能会破坏整个 gzip 流。

例如,标准 GZIP 标头有 10 个字节,其页脚长度为 8 个字节。

因此,您现在将 gzip 压缩结果采用原始格式(不是臃肿的 base64 编码格式),您将看到它有 95 个字节。

因此,header 和 hooter 的 18 个字节已经占输出的近 20%!

【讨论】:

  • 谢谢罗伯特,那我该怎么做呢?
  • 不要将数据转换为字符串,而是使用它的真实格式。例如,您的数据包含两个看起来像 UUID 的数据。在字符串表示中它们是 36 个字符,在二进制表示(只是数字)中只有 16 个字节。或者尝试找到一种不添加额外数据的压缩算法(但超过 10-15% 的压缩率你不会像 gzip 显示的那样得到)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 2013-11-28
  • 1970-01-01
相关资源
最近更新 更多