python gzip字符串解碼


一、緣起

mysql在存儲大文本時,有blob、text、mediumblob、mediumtext等字段類型可選。

最大值 對大小寫是否敏感
blob 64k Y
text 64k N
mediumblob 16M Y
mediumtext 16M N

當下業務相對粗獷, 對html網頁采用"先存儲后使用", 原始數據留有備份, 方便多次使用。而網頁是純文本型, 類似博客評論,但實際大部分大小超過80KB,故先用gzip壓縮算法處理網頁, 然后存儲壓縮后的文本。(gzip在此場景下的壓縮率接近70%, html壓縮后大小普遍在10k之內)。現需要解碼該文本, 還原原html並進行數據解析提取操作. 網上查閱知大部分python處理gzip字符串就是使用gzip的decompress、StringIO、zlib等等,但都不適用本場景. 下方給出python版處理,順便貼出參考的java代碼。

二、python代碼

def my_ungzip(in_str):
    decode_str = base64.decodebytes(in_str)    # 先使用base64解碼,不然會報header check等錯誤
    s = zlib.decompress(decode_str, 16 + zlib.MAX_WBITS).decode()
    print("gzip字符串解碼后:\n", s)
    return s

代碼運行結果如下:

三、參考的java版代碼

本次參考的java,實測可行.

import org.apache.commons.lang.StringUtils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Base64;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
 * @author zmh
 * @date 2020-01-07
 * <p>
 * Gzip壓縮字符串工具類
 */
class GzipUtils {

    public static final String GZIP_ENCODE_UTF_8 = "UTF-8";

    /**
     * base64 編碼
     *
     * @param bytes 傳入bytes
     * @return 編碼成string類型的base64返回
     */
    public static String base64encode(byte[] bytes) {
        return new String(Base64.getEncoder().encode(bytes));
    }

    /**
     * base64 解碼
     *
     * @param string 傳入string類型的base64編碼
     * @return 解碼成byte類型返回
     */
    public static byte[] base64decode(String string) {
        return Base64.getDecoder().decode(string);
    }

    /**
     * 壓縮字符串
     *
     * @param string 需要壓縮的字符串
     * @return 壓縮后內容 並轉base64 返回
     */
    public static String gzip(String string) {
        String result = "";
        if (StringUtils.isBlank(string)) {
            return result;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip;
        try {
            gzip = new GZIPOutputStream(out);
            gzip.write(string.getBytes(GZIP_ENCODE_UTF_8));
            gzip.close();
            out.close();
            result = base64encode(out.toByteArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 解壓縮字符串
     *
     * @param string base64格式的壓縮后字符串
     * @return 解碼並解壓縮后返回
     */
    public static String unGzip(String string) {
        String result = "";
        if (StringUtils.isBlank(string)) {
            return result;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in;
        GZIPInputStream ungzip;
        byte[] bytes = base64decode(string);
        try {
            in = new ByteArrayInputStream(bytes);
            ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = ungzip.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            ungzip.close();
            out.close();
            in.close();
            result = out.toString(GZIP_ENCODE_UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static void main(String[] args) {
        long temp = System.currentTimeMillis();
        String test = "Gzip壓壓壓壓縮縮縮縮縮測試測試測試測試測試試試試試試試試試試試aaaabbbbbccccccaaaabbbbbccccccaaaabbbbbccccccdddddd111111111111111111111111111111111111111";
        String gzip = gzip(test);
        String unGzip = unGzip(gzip);
        System.out.println("原文:" + test);
        System.out.println("Gzip壓縮:" + gzip);
        System.out.println("Gzip解壓:" + unGzip);
        System.out.println("整體消耗時間: " + (System.currentTimeMillis() - temp) + " ms");
    }
}

如果更佳便捷的方式方法, 歡迎留言探討,謝謝~!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM