亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用與.Net兼容的GZIPOutputStream壓縮和解壓縮字符串?

如何使用與.Net兼容的GZIPOutputStream壓縮和解壓縮字符串?

素胚勾勒不出你 2019-09-02 08:13:04
我需要一個在android中使用GZip壓縮字符串的示例。我想向方法發送一個像“hello”這樣的字符串并獲得以下壓縮字符串:BQAAAB + LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee ++ 997o7nU4n99 // P1xmZAFs9s5K2smeIYCqyB8 / fnwfPyLmeVlW / W + GphA2BQAAAA ==然后我需要解壓縮它。誰能給我一個例子并完成以下方法?private String compressString(String input) {    //...}private String decompressString(String input) {    //...}謝謝,更新根據scessor的回答,現在我有以下4種方法。Android和.net壓縮和解壓縮方法。除一種情況外,這些方法彼此兼容。我的意思是它們在前3個狀態中兼容但在第4個狀態下不兼容:狀態1)Android.compress < - > Android.decompress :( 好的)狀態2)Net.compress < - > Net.decompress :( 好的)狀態3)Net.compress - > Android.decompress :( 好的)狀態4)Android.compress - > .Net.decompress :( 不行)任何人都可以解決它嗎?Android方法:public static String compress(String str) throws IOException {    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());    gos.close();    os.close();    byte[] compressed = new byte[4 + os.toByteArray().length];    System.arraycopy(blockcopy, 0, compressed, 0, 4);    System.arraycopy(os.toByteArray(), 0, compressed, 4,            os.toByteArray().length);    return Base64.encode(compressed);}public static String decompress(String zipText) throws IOException {    byte[] compressed = Base64.decode(zipText);    if (compressed.length > 4)    {        GZIPInputStream gzipInputStream = new GZIPInputStream(                new ByteArrayInputStream(compressed, 4,                        compressed.length - 4));        ByteArrayOutputStream baos = new ByteArrayOutputStream();        for (int value = 0; value != -1;) {            value = gzipInputStream.read();            if (value != -1) {                baos.write(value);            }        
查看完整描述

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個字節。


為了獲得實際的壓縮,通常你需要為壓縮器提供更多的工作來處理這五個字節,這樣它就可以在可壓縮數據中找到重復的字符串和有偏差的統計數據。我知道你只是用短字符串進行測試。但是在實際應用中,你永遠不會使用具有這種短字符串的通用壓縮器,因為發送字符串總是更好。


查看完整回答
反對 回復 2019-09-02
?
小怪獸愛吃肉

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 );


查看完整回答
反對 回復 2019-09-02
  • 3 回答
  • 0 關注
  • 584 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號