微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C# 中使用 SharpZipLib 时,为什么压缩后字符串的 GZip 压缩大小大于原始大小

如何解决在 C# 中使用 SharpZipLib 时,为什么压缩后字符串的 GZip 压缩大小大于原始大小

我的字符串是一个 Json 文件 (test.json),内容如下

{
  "objectId": "bbad4cc8-bce8-438e-8683-3e603d746dee","timestamp": "2021-04-28T14:02:42.247Z","variable": "temperatureArray","model": "abc.abcdefg.abcdef","quality": 5,"value": [ 43.471600438222104,10.00940101687303,39.925500606152,32.34369812176735,33.07786476010357 ]
}

我压缩如下

using ICSharpCode.SharpZipLib.GZip;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;

namespace GZipTest
{
    public static class SharpZipLibCompression
    {
        public static void test()
        {
            Trace.WriteLine("****************SharpZipLib Test*****************************");
            var testFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),"test.json");
            var text = File.ReadAllText(testFile);
            var ipStringSize = System.Text.UTF8Encoding.Unicode.GetByteCount(text);
            var compressedString = Compressstring(text);
            var opStringSize = System.Text.UTF8Encoding.Unicode.GetByteCount(compressedString);
            float stringCompressionRatio = (float)opStringSize / ipStringSize;
            Trace.WriteLine("String Compression Ratio using SharpZipLib" + stringCompressionRatio);
        }

        public static string Compressstring(string text)
        {
            if (string.IsNullOrEmpty(text))
                return null;
            byte[] buffer = Encoding.UTF8.GetBytes(text);
            using (var compressedStream = new MemoryStream())
            {
                GZip.Compress(new MemoryStream(buffer),compressedStream,false);
                byte[] compressedData = compressedStream.ToArray();
                return Convert.ToBase64String(compressedData);
            }
        }
    }
}

但我的压缩字符串大小 (opStringSize) 大于原始字符串大小 (ipStringSize)。为什么?

解决方法

您的基准测试存在一些相当基本的问题:

  1. 在计算其长度时,您使用 UTF-16 将输入字符串编码为字节(UTF8Encoding.Unicode 只是一种不清楚的 Encoding.Unicode 书写方式,即 UTF-16)。编码为每个字符 2 个字节,但其中大部分字节将为 0。
  2. 您正在对输出进行 base64 编码。虽然这是一种将任意二进制数据打印为文本的方法,但它使用 4 个字符来表示 3 个字节的数据,因此您将输出的大小增加了 33%。
  3. 然后,您将使用 UTF-16 将 base64 编码的字符串再次转换为字节,每个字符再次需要 2 个字节。所以这是一个人为的 2 倍添加到您的结果中...

碰巧 UTF-16 的两次使用或多或少抵消了,但是 base64 编码位仍然是造成您看到的许多差异的原因。

去掉它,你得到的压缩比为:0.80338985。

这还不错,因为压缩会带来开销:有些数据总是需要出现在 GZip 流中,而且无论您的数据压缩得如何,它都存在。您只能真正期望压缩会对较大的输入产生显着影响。

See here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。