文档章节

GZIP压缩解压类

 夏碌冬藏
发布于 2016/07/13 15:49
字数 815
阅读 76
收藏 3

    针对一些与APP交互的网站,经常用json格式,这样明文有些不安全以及很容易被爬,且数据量大,因此用gzip来进行压缩并用base64编码,避免上述问题,直接上代码:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
 * GZIP压缩解压类
 */
public class StringGZIP {

	private static String encode = "UTF-8";

	private static final String CODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-/=";

	/**
	 * base64解密
	 * 
	 * @param input
	 * @return
	 */
	public static byte[] base64Decode(String input) {
		if (input.length() % 4 != 0) {
			throw new IllegalArgumentException("Invalid base64 input");
		}
		byte decoded[] = new byte[((input.length() * 3) / 4)
				- (input.indexOf('=') > 0 ? (input.length() - input.indexOf('=')) : 0)];
		char[] inChars = input.toCharArray();
		int j = 0;
		int b[] = new int[4];
		for (int i = 0; i < inChars.length; i += 4) {
			// This could be made faster (but more complicated) by precomputing
			// these index locations.
			b[0] = CODES.indexOf(inChars[i]);
			b[1] = CODES.indexOf(inChars[i + 1]);
			b[2] = CODES.indexOf(inChars[i + 2]);
			b[3] = CODES.indexOf(inChars[i + 3]);
			decoded[j++] = (byte) ((b[0] << 2) | (b[1] >> 4));
			if (b[2] < 64) {
				decoded[j++] = (byte) ((b[1] << 4) | (b[2] >> 2));
				if (b[3] < 64) {
					decoded[j++] = (byte) ((b[2] << 6) | b[3]);
				}
			}
		}
		return decoded;
	}

	/**
	 * base64加密
	 * 
	 * @param in
	 * @return
	 */
	public static String base64Encode(byte[] in) {
		StringBuilder out = new StringBuilder((in.length * 4) / 3);
		int b;
		for (int i = 0; i < in.length; i += 3) {
			b = (in[i] & 0xFC) >> 2;
			out.append(CODES.charAt(b));
			b = (in[i] & 0x03) << 4;
			if (i + 1 < in.length) {
				b |= (in[i + 1] & 0xF0) >> 4;
				out.append(CODES.charAt(b));
				b = (in[i + 1] & 0x0F) << 2;
				if (i + 2 < in.length) {
					b |= (in[i + 2] & 0xC0) >> 6;
					out.append(CODES.charAt(b));
					b = in[i + 2] & 0x3F;
					out.append(CODES.charAt(b));
				} else {
					out.append(CODES.charAt(b));
					out.append('=');
				}
			} else {
				out.append(CODES.charAt(b));
				out.append("==");
			}
		}
		return out.toString();
	}

	public String getEncode() {
		return encode;
	}

	/*
	 * 设置 编码,默认编码:UTF-8
	 */
	public void setEncode(String encode) {
		StringGZIP.encode = encode;
	}

	/**
	 * 字符串压缩为字节数组,默认UTF-8编码
	 * 
	 * @param str
	 * @return
	 */
	public static String compress(String str) {
		if (str == null || str.length() == 0) {
			return null;
		}
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		GZIPOutputStream gzip;
		try {
			gzip = new GZIPOutputStream(out);
			gzip.write(str.getBytes(encode));
			gzip.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return base64Encode(out.toByteArray());
	}

	/**
	 * 字符串压缩为字节数组
	 * 
	 * @param str
	 * @param encoding
	 * @return
	 */
	public static String compress(String str, String encoding) {
		if (str == null || str.length() == 0) {
			return null;
		}
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		GZIPOutputStream gzip;
		try {
			gzip = new GZIPOutputStream(out);
			gzip.write(str.getBytes(encoding));
			gzip.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return base64Encode(out.toByteArray());
	}

	/**
	 * 字节数组解压缩后返回字符串,默认编码为UTF-8
	 * 
	 * @param zipText
	 * @return
	 */
	public static String decompress(String zipText) {
		byte[] b = base64Decode(zipText);
		if (b == null || b.length == 0) {
			return null;
		}
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		ByteArrayInputStream in = new ByteArrayInputStream(b);

		try {
			GZIPInputStream gunzip = new GZIPInputStream(in);
			byte[] buffer = new byte[256];
			int n;
			while ((n = gunzip.read(buffer)) >= 0) {
				out.write(buffer, 0, n);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return out.toString();
	}

	/**
	 * 字节数组解压缩后返回字符串
	 * 
	 * @param zipText
	 * @param encoding
	 * @return
	 */
	public static String decompress(String zipText, String encoding) {
		byte[] b = base64Decode(zipText);
		if (b == null || b.length == 0) {
			return null;
		}
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		ByteArrayInputStream in = new ByteArrayInputStream(b);

		try {
			GZIPInputStream gunzip = new GZIPInputStream(in);
			byte[] buffer = new byte[256];
			int n;
			while ((n = gunzip.read(buffer)) >= 0) {
				out.write(buffer, 0, n);
			}
			return out.toString(encoding);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}

    使用案例:

    @Test
    public void decompress1() {
        String tempString = "sdfji汉字测试";
        String compress = StringGZIP.compress(tempString);
        System.out.println(compress);
        String decompress = StringGZIP.decompress(compress);
        System.out.println(decompress);
        tempString = "sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试";
         compress = StringGZIP.compress(tempString);
        System.out.println(compress);
         decompress = StringGZIP.decompress(compress);
        System.out.println(decompress);
    }

    测试输出:

H4sIAAAAAAAAACtOScvKfLax8+na6c+2dr9YPxUAoOKrwBEAAAA=
sdfji汉字测试
H4sIAAAAAAAAACtOScvKfLax8+na6c+2dr9YP7V4sAoAAO-IIA6qAAAA
sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试sdfji汉字测试

 

    对于重复字段越多,压缩率越高!

© 著作权归作者所有

粉丝 10
博文 58
码字总数 15389
作品 0
赣州
后端工程师
私信 提问
李景枫/compress

Compress 目录 [TOC] 开源产品介绍(微服务基础设施QQ交流群:191958521) 配置中心(mconf) GITHUB:https://github.com/yu120/mconf 码云:https://git.oschina.net/yu120/mconf 微核心(mi...

李景枫
2017/04/23
0
0
Java压缩算法性能比较

前言 游戏开发中,经常在玩家进入游戏的时候进行必要的信息初始化,往往这个初始化信息数据包是相对来说还是比较大的,一般在30-40kb左右,还是有必要进行压缩一下再发送消息,刚好前段时间看...

ksfzhaohui
2016/12/13
7K
18
Filter-全站GZIP压缩

GZIP压缩:将压缩后的文本文件,发送给浏览器,减少流量。 一、进行gzip压缩条件:   1、请求头:Accept-Encoding : gzip 告诉服务器,该浏览器支持gzip压缩。   2、响应头:Content-Enc...

陈小默
2016/03/06
79
1
Linux下文件的打包、解压缩指令——tar,gzip,bzip2

Linux下文件的打包、解压缩指令——tar,gzip,bzip2   本文是对 鸟叔的Linux私房菜(基础学习篇) 第三版 的学习笔记,原文可参考原书中文网站 鸟叔的Linux私房菜。更多详细信息可直接参考对...

xiaocao13140
2018/05/28
0
0
linux文件压缩与打包(一)

一、Linux常见压缩文件.gz .bz2 .xz .zip,前三个不能干文件夹,zip跟windows下那个一样。默认模式下压缩成绩按压缩率排xz>bz2>gz≈zip按CPU占用排列zip≈gz...

whytl
2018/01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
35分钟前
2
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
5
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
3
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
3
0
nginx-rtmp-module的缺陷分析(二)

nginx-rtmp-module使用指令push和pull来relay媒体流数据,以便分布式部署服务。 当nginx-rtmp-module作为边缘服务器(一般不会向边缘服务器推流)时,使用pull从源服务器获取媒体流数据,俗称...

YoungSagit
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部