代码之家  ›  专栏  ›  技术社区  ›  Geoff Smith

如何在Python中解压缩用gzip压缩的文本?

  •  1
  • Geoff Smith  · 技术社区  · 6 年前

    如何在python3中解压一个文本字符串,它已经用gzip压缩并转换为base64?

    例如,文本:

    应转换为:

    以下 C# 代码成功执行以下操作:

    var gzBuffer = Convert.FromBase64String(compressedText);
    
    using (var ms = new MemoryStream()) {
        int msgLength = BitConverter.ToInt32(gzBuffer, 0);
        ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
    
        var buffer = new byte[msgLength];
    
        ms.Position = 0;
        using (var zip = new GZipStream(ms, CompressionMode.Decompress)) {
            zip.Read(buffer, 0, buffer.Length);
        }
    
        return Encoding.UTF8.GetString(buffer);
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   AlphaBeta    6 年前

    你可以用 gzip base64

    >>> import gzip
    >>> import base64
    
    >>> s = 'EgAAAB+LCAAAAAAABAALycgsVgCi4vzcVAWFktSKEgC9n1/fEgAAAA=='
    >>> gz = base64.b64decode(s)
    >>> gz
    b'\x12\x00\x00\x00\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\x0b\xc9\xc8,V\x00\xa2\xe2\xfc\xdcT\x05\x85\x92\xd4\x8a\x12\x00\xbd\x9f_\xdf\x12\x00\x00\x00'
    
    # If you need the length
    import struct
    # Unpacks binary encoded 4 byte integer (assume native byte order)
    # Only select first four bytes with [:4] slice
    >>> struct.unpack('i', gz[:4])[0]
    18
    
    # Skip length value with [4:] slice
    >>> gzip.decompress(gz[4:]).decode('UTF8')
    'This is some  text'