Unity3D研究院之LZMA壓縮文件與解壓文件
http://www.xuanyusong.com/archives/3095
前兩天有朋友告訴我Unity的Assetbundle是LZMA壓縮的,剛好今天有時間那麼就研究研究LZMA。它是一個開源的類庫,有C、 C++、C#、JAVA的類庫,那麼在我大Unity裏面我們當然要使用C#的類庫啦。
下載地址:http://www.7-zip.org/sdk.html 或者在文章的最後下載我的測試工程、如下圖所示,因爲9.22是Beta版本,所以我們還是老老實實下載9.20正式版本。
解壓後把整個CS文件夾拖入Unity工程即可。當我在拖入Unity的時候發現Settings.cs報錯了,查了一下是因爲mono並不是完整的.net 。不過這個文件我們不需要用,所以直接把Settings.cs刪除即可。
下面上代碼,這是編輯時的一個類。我先把根目錄下的一個文件壓縮,接着在解壓縮。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
using UnityEngine; using System.Collections; using UnityEditor; using SevenZip.Compression.LZMA; using System.IO; using System;
public class Test : Editor {
[MenuItem ("MyMenu/CompressFile")] static void CompressFile () { //壓縮文件 CompressFileLZMA(Application.dataPath+"/1.jpg",Application.dataPath+"/2.zip"); AssetDatabase.Refresh();
} [MenuItem ("MyMenu/DecompressFile")] static void DecompressFile () { //解壓文件 DecompressFileLZMA(Application.dataPath+"/2.zip",Application.dataPath+"/3.jpg"); AssetDatabase.Refresh(); }
private static void CompressFileLZMA(string inFile, string outFile) { SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder(); FileStream input = new FileStream(inFile, FileMode.Open); FileStream output = new FileStream(outFile, FileMode.Create); // Write the encoder properties coder.WriteCoderProperties(output); // Write the decompressed file size. output.Write(BitConverter.GetBytes(input.Length), 0, 8); // Encode the file. coder.Code(input, output, input.Length, -1, null); output.Flush(); output.Close(); input.Close(); } private static void DecompressFileLZMA(string inFile, string outFile) { SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder(); FileStream input = new FileStream(inFile, FileMode.Open); FileStream output = new FileStream(outFile, FileMode.Create); // Read the decoder properties byte[] properties = new byte[5]; input.Read(properties, 0, 5); // Read in the decompress file size. byte [] fileLengthBytes = new byte[8]; input.Read(fileLengthBytes, 0, 8); long fileLength = BitConverter.ToInt64(fileLengthBytes, 0);
// Decompress the file. coder.SetDecoderProperties(properties); coder.Code(input, output, input.Length, fileLength, null); output.Flush(); output.Close(); input.Close(); }
} |
我參考了這篇文章,不過它點問題,所以我改了改。
http://stackoverflow.com/questions/7646328/how-to-use-the-7z-sdk-to-compress-and-decompress-a-file
如下圖所示,我把1.jpg先壓縮成2.zip ,然後在把2.zip在解壓成3.jpg。
下載地址:http://pan.baidu.com/s/1dDBxyBv
如果你想運行時運行LZMA按照上述代碼簡單改改就可以使用了。比如你把壓縮過的文件放在服務器,然後用www下載到內存以後,可以通過lzma的解壓方法將文件還原在保存在本地。 歡迎大家一起討論與學習。嘿嘿,或者有什麼更好的壓縮方式,歡迎在下面給我留言,謝謝。
- 本文固定鏈接: https://www.xuanyusong.com/archives/3095
- 轉載請註明: 雨鬆MOMO 2014年08月12日 於 雨鬆MOMO程序研究院 發表