您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Android數據壓縮的方法是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Android數據壓縮的方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在開發中我們難免會碰到傳輸的數據太大,或者傳輸的資源過大,所以就出現了數據壓縮這項技術,現在存在很多種數據壓縮的算法,每種算法都有自己的特點和使用場景,這次就想簡單來聊聊關于數據壓縮這件事。
為什么會想到這個問題,因為碰到了一些場景,我不知道是大家對數據壓縮這個概念太模糊不敢去使用,還是因為深思熟慮覺得影響性能太大不想用。我這有個需求,給鏈接拼接參數,然后跳轉這個鏈接,另外一邊從中拿到拼接的參數,其實就是get請求,但是,現在的情況是拼接后的鏈接又臭又長,就是url?a=xxx&b=xxx&c=xxx......這種,然后就瘋狂往后面拼參數。把整個對象拆了往后面拼。那為何不把對象轉成json然后壓縮呢?
是覺得字符串不能壓縮?還是設計時沒有意識到還有壓縮這事?還是覺得你幾十年的開發直覺告訴你使用壓縮會出大問題。
首先什么是數據壓縮?舉個簡單的例子,我把AAABBBCCC這個字符串變成3A3B3C,就是一種壓縮的思想。
寫個Demo演示一下java使用Deflater對字符串進行壓縮
public class Test { public static String compress(String str) { Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION); deflater.setInput(str.getBytes()); deflater.finish(); final byte[] bytes = new byte[256]; ByteArrayOutputStream bos = new ByteArrayOutputStream(256); while (!deflater.finished()) { int length = deflater.deflate(bytes); bos.write(bytes, 0, length); } deflater.end(); String result = Base64.encodeToString(bos.toByteArray(), Base64.NO_PADDING); Log.v("mmp", "壓縮后結果" + result); return result; } }
在外部調用
String str = "ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE"; String result = Test.compress(str);
可以看到結果
壓縮后結果eNpzdHJ2cXUkhQAATY4NFw
看得出壓縮前和壓縮后的一個明顯的效果。
有人看到這個可能就想到,哦,原來用Base64壓縮,這是一個誤區,有一定開發經驗或者一定基礎的朋友都知道,但是可能一些萌新不太熟,我前面也寫過了,Base64不是壓縮,是一種編碼,如果你純用Base64的話,它只會變得更長。
那為什么還要在這里用Base64呢?Base64是為了將字節數組轉成字符串,數據壓縮和解壓的對象是字節數組,所以壓縮可以對字符串壓縮,也可以對文件壓縮,因為它是針對byte[]
有的人就會說,懂了,那簡單,那我圖片和視頻的壓縮也用Deflater。這東西還真不一樣,壓縮又分為有損壓縮和無損壓縮,我們上面使用Deflater進行的壓縮是無損壓縮,是可逆的,而圖片和視頻的壓縮往往會用有損壓縮比較多,特別是視頻,壓縮率很高,因為有損壓縮能把數據壓得更小,相對得它是不可逆的。所以對數據和資源要使用哪種壓縮方式要看具體的場景。比如這里的對字符串壓縮,要是使用有損的方式,那解壓出來的字符串不就和原字符串內容不同了嗎。
相信看到這里,你已經對數據的壓縮這個概念有個大概的了解。
前面有說到數據壓縮的算法有很多種,甚至你也可以自己設計出一套算法,然后寫專利。而Deflater算法是一種常用的數據無損壓縮算法。
可以很容易的找到Deflate壓縮算法=LZ77+哈夫曼編碼,意思是這套算法內部的實現原理就是使用LZ77和哈夫曼編碼。
我這邊暫時先不講這些算法的實現過程和原理,因為內容也是比較多,如果以后有時間單獨拿出來寫,并且手寫一遍用代碼去實現這些算法(一般都是用C寫) ,這里就只簡單介紹一下,有個概念就行。
LZ77編碼是一種基于字典的、“滑動窗”的無損壓縮算法。
簡單來說就是滑動的過程中,把前面的子串放到字典中,滑動到后面發現相同的子串時只需要替換成子串的位置和長度的信息進去就行。
例如ABCDEFABCDZZZ → ABCDEF(6,4)ZZZ
意思是往前第6個,長度為4。
當然這只是簡單的一個體現思路的例子,實際中肯定沒有這么簡單,比如子串怎么找啊,滑動怎么滑等等之類的。
哈夫曼編碼,又涉及到哈夫曼樹,貪心算法。該方法完全依據字符出現概率來構造異字頭的平均長度最短的碼字。
因為這個要根據字符出現的頻率構建哈夫曼樹,不好簡單易懂的演示出來,這里就拿一個別人寫的Demo來直接演示效果。
原字符串:BCAADDDCCACACAC
轉成二進制后:
10000100100001101000001010000010100010001000100010001000100001101000011010000010100001101000001010000110100000101000011
編碼后:1000111110110110100110110110
能看出壓縮的效果很明顯。
Deflater算法是一種常用的數據壓縮算法,其內部是使用LZ77和哈夫曼編碼。壓縮算法一般都具備平臺無關性,它是一種計算,一種思想,java使用的是Deflater這個類,php也有對應的庫,go也有對應的庫。甚至當你知道了它的原理之后,你也能自己把實現過程給寫出來,當然這很麻煩,畢竟涉及算法還是有一定難度。所以一般在開發中你得知道有這么一個東西,它是干嘛的,怎么使用。當然最好還是能知道它的原理,知道它怎么實現的,這并不是毫無作用,當你去學之后,你一定能收獲到一些東西。
可以再擴展一下,像圖片的質量壓縮,就是一種有損壓縮的方式,像視頻的H264編碼,H265編碼等,也是一個有損的過程。要心里有個底,對這個數據進行操作,是否需要可逆,是否是針對它的大小,可逆就用無損壓縮的算法,為了極致的壓縮大小又無所謂不可逆,那就用有損壓縮的算法。對數據的傳輸是否要安全,全都無所謂就明文傳輸最快,對其大小有要求就壓縮,要求安全就加密。開發就這么簡單!
GZIP也是一種壓縮技術,相信很多人都聽說過。我們的http請求頭中可以配置content-encoding為gzip,那么服務端返回的數據就是經過gzip壓縮過之后的數據。那有什么用呢?你文件大,字節數多,傳輸的速度就慢,我經過gizp壓縮之后,壓縮率高,傳輸的字節數少很多,那傳輸的速度就快。
有的人也會說,那你壓縮可解壓也是耗時間的啊。說得好,這種我建議你不要信什么原理,直接去實踐,去試試使用GZIP壓縮和不使用韓國,誰得速度更快。當然數據量大的情況下去測。你會發現哪怕我經過壓縮和解壓,也比你直接傳輸的速度更快。
讀到這里,這篇“Android數據壓縮的方法是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。