第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

素胚勾勒不出你 2019-09-02 08:13:04
我需要一個(gè)在android中使用GZip壓縮字符串的示例。我想向方法發(fā)送一個(gè)像“hello”這樣的字符串并獲得以下壓縮字符串:BQAAAB + LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee ++ 997o7nU4n99 // P1xmZAFs9s5K2smeIYCqyB8 / fnwfPyLmeVlW / W + GphA2BQAAAA ==然后我需要解壓縮它。誰(shuí)能給我一個(gè)例子并完成以下方法?private String compressString(String input) {    //...}private String decompressString(String input) {    //...}謝謝,更新根據(jù)scessor的回答,現(xiàn)在我有以下4種方法。Android和.net壓縮和解壓縮方法。除一種情況外,這些方法彼此兼容。我的意思是它們?cè)谇?個(gè)狀態(tài)中兼容但在第4個(gè)狀態(tài)下不兼容:狀態(tài)1)Android.compress < - > Android.decompress :( 好的)狀態(tài)2)Net.compress < - > Net.decompress :( 好的)狀態(tài)3)Net.compress - > Android.decompress :( 好的)狀態(tài)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貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超22個(gè)贊

無(wú)論是什么壓縮“BQAAAB + LC”的“Hello”都是gzipper特別差的實(shí)現(xiàn)。它擴(kuò)展了“Hello”遠(yuǎn)遠(yuǎn)超過(guò)必要的范圍,使用動(dòng)態(tài)塊而不是deflate格式的靜態(tài)塊。刪除gzip流的四字節(jié)前綴(始終以hex 1f 8b開(kāi)頭)后,“Hello”擴(kuò)展為123字節(jié)。在壓縮世界中,這被視為犯罪。


您抱怨的Compress方法正常且正常。它生成一個(gè)靜態(tài)塊,總輸出為25個(gè)字節(jié)。gzip格式具有10字節(jié)頭和8字節(jié)尾部開(kāi)銷(xiāo),使得5字節(jié)輸入已經(jīng)被編碼為7個(gè)字節(jié)。這還差不多。


不可壓縮的流將被擴(kuò)展,但它不應(yīng)該太多。對(duì)于不可壓縮數(shù)據(jù),gzip使用的deflate格式將為每16K到64K增加5個(gè)字節(jié)。


為了獲得實(shí)際的壓縮,通常你需要為壓縮器提供更多的工作來(lái)處理這五個(gè)字節(jié),這樣它就可以在可壓縮數(shù)據(jù)中找到重復(fù)的字符串和有偏差的統(tǒng)計(jì)數(shù)據(jù)。我知道你只是用短字符串進(jìn)行測(cè)試。但是在實(shí)際應(yīng)用中,你永遠(yuǎn)不會(huì)使用具有這種短字符串的通用壓縮器,因?yàn)榘l(fā)送字符串總是更好。


查看完整回答
反對(duì) 回復(fù) 2019-09-02
?
小怪獸愛(ài)吃肉

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊

我在我的項(xiàng)目中嘗試了你的代碼,并在Android上的compress方法中發(fā)現(xiàn)了一個(gè)編碼錯(cuò)誤:


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

在上面的代碼中,你應(yīng)該使用更正的編碼,并填充字節(jié)長(zhǎng)度,而不是字符串長(zhǎng)度:


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


查看完整回答
反對(duì) 回復(fù) 2019-09-02
  • 3 回答
  • 0 關(guān)注
  • 575 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)