3 回答
TA贡献1842条经验 获得超21个赞
无论是什么压缩“BQAAAB + LC”的“Hello”都是gzipper特别差的实现。它扩展了“Hello”远远超过必要的范围,使用动态块而不是deflate格式的静态块。删除gzip流的四字节前缀(始终以hex 1f 8b开头)后,“Hello”扩展为123字节。在压缩世界中,这被视为犯罪。
您抱怨的Compress方法正常且正常。它生成一个静态块,总输出为25个字节。gzip格式具有10字节头和8字节尾部开销,使得5字节输入已经被编码为7个字节。这还差不多。
不可压缩的流将被扩展,但它不应该太多。对于不可压缩数据,gzip使用的deflate格式将为每16K到64K增加5个字节。
为了获得实际的压缩,通常你需要为压缩器提供更多的工作来处理这五个字节,这样它就可以在可压缩数据中找到重复的字符串和有偏差的统计数据。我知道你只是用短字符串进行测试。但是在实际应用中,你永远不会使用具有这种短字符串的通用压缩器,因为发送字符串总是更好。
TA贡献1852条经验 获得超1个赞
我在我的项目中尝试了你的代码,并在Android上的compress方法中发现了一个编码错误:
byte[] blockcopy = ByteBuffer
.allocate(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(str.length())
.array();
ByteArrayOutputStream os = new ByteArrayOutputStream(str.length());
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write(str.getBytes());
在上面的代码中,你应该使用更正的编码,并填充字节长度,而不是字符串长度:
byte[] data = str.getBytes("UTF-8");
byte[] blockcopy = ByteBuffer
.allocate(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(data.length)
.array();
ByteArrayOutputStream os = new ByteArrayOutputStream( data.length );
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write( data );
- 3 回答
- 0 关注
- 534 浏览
添加回答
举报