记一次字符串压缩操作

栏目: 编程工具 · 发布时间: 5年前

内容简介:项目中遇到一个场景:需要将一批数据发送到APP端,且实际应用场景中,对数据的长度有一定的限制,于是就需要用到字符串压缩。APP端使用所有示例代码可以在

记一次字符串压缩操作

项目中遇到一个场景:需要将一批数据发送到APP端,且实际应用场景中,对数据的长度有一定的限制,于是就需要用到字符串压缩。

APP端使用 Java ,后端使用 Golang ,使用 gzip 压缩,同时涉及到了 base64 编码,中文和西欧字符集转码。

过程描述

  1. 后端:

    1. 字符集转换 参考自: 一个复杂的中文编码问题
    2. 压缩字符串
    3. 使用base64编码为可见字符
    4. 网络传输
  2. APP端

    1. 接收网络响应
    2. base64解码,得到一个字节数组(压缩的)
    3. gzip读取压缩的字节流,解压缩
    4. 转码为中文

示例代码

所有示例代码可以在 这里 找到

  1. server端
func compress(s string) string {
    //使用GBK字符集encode
    gbk, err := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(s))
    if err != nil {
        logrus.Error(err)
        return ""
    }

    //转为ISO8859_1,也就是latin1字符集
    latin1, err := charmap.ISO8859_1.NewDecoder().Bytes(gbk)
    if err != nil {
        return ""
    }

    //使用gzip压缩
    var buf bytes.Buffer
    zw := gzip.NewWriter(&buf)

    _, err = zw.Write(latin1)
    if err != nil {
        logrus.Fatal(err)
    }

    if err := zw.Close(); err != nil {
        logrus.Fatal(err)
    }

    //使用base64编码
    encoded := base64.StdEncoding.EncodeToString(buf.Bytes())
    fmt.Println(encoded)
    return encoded
}
  1. APP端
private static String uncompress(String s) throws IOException {

        //base64 decode
        byte[] byteArray = Base64.getDecoder().decode(s);
        ByteArrayInputStream bis = new ByteArrayInputStream(byteArray);
        
        //gzip解压
        GZIPInputStream gis = new GZIPInputStream(bis);
        BufferedReader br = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        br.close();
        gis.close();
        bis.close();

        //使用latin1字符集获得bytes
        byte[] latin1 = sb.toString().getBytes("ISO_8859_1");
        //转换回GBK
        return new String(latin1, "GBK");
    }

使用base64编码,主要是因为经过gzip压缩后数据,直接转成字符串的话,会有很多不可见字符,这样在传输过程中,通常会被服务端框架转义,从而失真。

代码仅作为示例使用,实际业务编码请注意检查错误和异常等。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机组成(第 6 版)

计算机组成(第 6 版)

Andrew S. Tanenbaum、Todd Austin / 刘卫东、宋佳兴 / 机械工业出版社 / 2014-8-19 / CNY 99.00

本书采用结构化方法来介绍计算机系统,书的内容完全建立在“计算机是由层次结构组成的,每层完成规定的功能”这一概念之上。作者对本版进行了彻底的更新,以反映当今最重要的计算机技术以及计算机组成和体系结构方面的最新进展。书中详细讨论了数字逻辑层、微体系结构层、指令系统层、操作系统层和汇编语言层,并涵盖了并行体系结构的内容,而且每一章结尾都配有丰富的习题。本书适合作为计算机专业本科生计算机组成与结构课程的教......一起来看看 《计算机组成(第 6 版)》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换