3 回答
TA貢獻1842條經驗 獲得超22個贊
無論是什么壓縮“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 關注
- 584 瀏覽
添加回答
舉報
