Unity3D研究院之LZMA壓縮文件與解壓文件

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的解壓方法將文件還原在保存在本地。 歡迎大家一起討論與學習。嘿嘿,或者有什麼更好的壓縮方式,歡迎在下面給我留言,謝謝。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章