vb.net - 是否有比 DotNetZip 或 LZMA 更好的字符串压缩库?

标签 vb.net compression

我有一个超过 800 个字符的数据字符串,我正试图将其压缩以用于 QR 码(我想要至少 50%,但如果我把它压缩到少于 700 个可能会很高兴) .这是我尝试压缩的示例字符串,包含 841 个字符:

+hgoSuJm2ecydQj9mXXzmG6b951L2KIl0k9VGzIEtLztuWO2On9rt7DUlH0lXzG4iJ1yK0fA
97mDyclKSttIZXOxSPBf85LEN4PUUqj65aio5qwZttZSZ64wpnMFg/7Alt1R39IJvTmeYfBm
Tuc1noMMcknlydFocwI8/sk2Sje5MR/nYNX0LPkQhzyi5vFJdrndqAgXYULsYrB3TJDAwvgs
Kw9C5EJnrlqcb21zg17O2gU/C8KY0pz9RPzUl1Sb0rCP8iZCeis4YbQ5tuUppOfnO/X0Mosv
SOQJ/bF9juKW8ocnQvNjsNxGV1gPkWWtiU2Old7Qm7FLDqL6kQKrq356yifs0NiMVGdvAg32
eugewuttCugoZASYOpQdwPu1jMxVO1fzF3zEy5w6tDlcfA2DZwa+un9/k8XZWAO/KVExy68q
UtVRQxsIOKgpl/2tNw5DBAKbykKIkmizbsA2xtzqnYqld4kOdNMJh3YjlqWF9Bt8MZo7a+Q6
jgayr2rjpyIptc599DGtvp68ZNQ64TKNmiMnnyGMo3E+xW34G3RrsYnHGm+xJoLKoOJhacDu
oZke1ycJgQv+Y61WPrvtFOVBxV5rvSzO0+8px5AWN3uCrrw1RmT5N14IVhh6BOtRjsifqIB2
dAKxzBNsvbXm1SzkuyqYiMnp5ivy3m2mPwc9GLsykx0FRIkhCYO8ins9E5ot9QvVnE155MFA
8FVwsP5uNdOF4EzQS2/h2QK3zb5Yq4Nftlo605Dd5vuVN/A7CUN38DaAKBxDKgqDzydfQnZw
R0hTfMHNLgBJKNDSpz2P6almGlUJtXT6IYmzuU2Iaion8ePG

我已经尝试过以下三个库:
  • 内置.NET GzipStream
  • DotNetZip,包括,
  • GzipStream
  • DeflateStream
  • 来自 7-zip 的 LZMA SDK

  • 我遇到了一个问题,即压缩实际上使字符串变长。我的理解是 DeflateStream 的开销最少,但它仍在添加字符。使用 DotNetZip,我告诉它使用最大压缩:
    Imports Ionic.Zlib
    
    Shared Function CompressData(data As Byte()) As Array
    
        Dim msCompressed As MemoryStream = New MemoryStream
    
        ' I'm not sure if the last parameter on this next function should be
        ' true (for LeaveOpen), but it doesn't seem to affect it either way.
        Dim deflated As DeflateStream = New DeflateStream(msCompressed, _
            CompressionMode.Compress, CompressionLevel.BestCompression, True)
    
        ' Write data to compression stream (which is linked to the memorystream)
        deflated.Write(data, 0, data.Length)
        deflated.Flush()
        deflated.Close()
    
        Return msCompressed.ToArray
    End Function
    

    我只是认为情况会变得更糟,因为我将拥有更多数据。对于这种长度的字符串,是否有更好的压缩算法?压缩通常只适用于较长的字符串吗?不幸的是,数据是这样的,我不能为数据片段使用替代字符。

    另外,我可以对二维码使用字母数字编码,还是必须使用二进制?我认为我不能,按照 http://www.qrme.co.uk/qr-code-forum.html?func=view&catid=3&id=324 ,但我想确定一下。

    谢谢你的帮助!

    最佳答案

    这个答案与古法的答案有关。他说二维码可以接受二进制数据,这肯定是你使用的库的限制。

    我查看了库的源代码。你调用 Encode 函数对吗?这是encode函数的内容

    public virtual Bitmap Encode(String content, Encoding encoding)
    {
        bool[][] matrix = calQrcode(encoding.GetBytes(content));
        SolidBrush brush = new SolidBrush(qrCodeBackgroundColor);
        Bitmap image = new Bitmap( (matrix.Length * qrCodeScale) + 1, (matrix.Length * qrCodeScale) + 1);
        Graphics g = Graphics.FromImage(image);
        g.FillRectangle(brush, new Rectangle(0, 0, image.Width, image.Height));
        brush.Color = qrCodeForegroundColor ;
        for (int i = 0; i < matrix.Length; i++)
        {
            for (int j = 0; j < matrix.Length; j++)
            {
                if (matrix[j][i])
                {
                    g.FillRectangle(brush, j * qrCodeScale, i * qrCodeScale, qrCodeScale, qrCodeScale);
                }
            }
        }
        return image;
    }
    

    第一行 (encoding.GetBytes(content)) 将字符串转换为字节。

    获取源代码然后修改它有这个功能:“public virtual Bitmap Encode(bytes[] content)”

    关于vb.net - 是否有比 DotNetZip 或 LZMA 更好的字符串压缩库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7130052/

    相关文章:

    java - Java Deflate 的静态字典

    vb.net - 文件系统观察器不工作

    c# - 包装另一个流的 Stream 的实现

    arrays - 用文本文件填充两个一维数组

    java - 在 Java 中实现对象的内存压缩

    compression - wbtc.cc.tar.zst

    C# 在将字符串转换为 byte[] 并将 byte[] 转换为字符串时出现内存不足异常

    compression - 用于序列化足部压力图的最佳无损压缩技术

    asp.net - 正则表达式或 Try Catch 来验证 double - 最佳性能

    ASP.NET Global.asax - bundle 中的 IE 条件样式表