Unity3D研究院之LZMA压缩文件与解压文件

20 篇文章 0 订阅

前两天有朋友告诉我Unity的Assetbundle是LZMA压缩的,刚好今天有时间那么就研究研究LZMA。它是一个开源的类库,有C、 C++、C#、JAVA的类库,那么在我大Unity里面我们当然要使用C#的类库啦。

下载地址:http://www.7-zip.org/sdk.html  或者在文章的最后下载我的测试工程、如下图所示,因为9.22是Beta版本,所以我们还是老老实实下载9.20正式版本。

Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 1

 

解压后把整个CS文件夹拖入Unity工程即可。当我在拖入Unity的时候发现Settings.cs报错了,查了一下是因为mono并不是完整的.net 。不过这个文件我们不需要用,所以直接把Settings.cs删除即可。

Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 2

 

下面上代码,这是编辑时的一个类。我先把根目录下的一个文件压缩,接着在解压缩。

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

http://www.xuanyusong.com/archives/3095

如下图所示,我把1.jpg先压缩成2.zip ,然后在把2.zip在解压成3.jpg。

Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 3

 

下载地址:http://pan.baidu.com/s/1dDBxyBv

如果你想运行时运行LZMA按照上述代码简单改改就可以使用了。比如你把压缩过的文件放在服务器,然后用www下载到内存以后,可以通过lzma的解压方法将文件还原在保存在本地。 欢迎大家一起讨论与学习。嘿嘿,或者有什么更好的压缩方式,欢迎在下面给我留言,谢谢。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值