用于Unity(windows\iOS\安卓)的纯C版LZMA压缩算法库(dll .so和.a)

前端之家收集整理的这篇文章主要介绍了用于Unity(windows\iOS\安卓)的纯C版LZMA压缩算法库(dll .so和.a)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

自行封装的LZMA接口库,用于unity,包括win平台的dll,安卓的so动态库和iOS的.a静态库

LZMA是目前压缩比最高的压缩算法,官方提供了多种语言的版本,unity中可以直接使用C#版,但是实际证明纯C版的压缩速度是C#版的四五倍。

封装工程介绍

  1. LZMA(Xcode)是一个iOS的静态库工程,直接在xcode中run一下即可得到对应的.a静态库,顶层接口封装在LZMALib.c中;

  2. LZMA(AndroidStudio)是一个支持runtime C++的安卓工程,顶层接口封装在LZMALib.c中,build一下对应的.so库会装进apk包中,解压apk可以得到里面的LZMA so库(apk路径:..\app\build\outputs\apk\debug)。

  3. 7zSDK(VS)是LZMA官方完整的SDK和源码工程,编译LZMA动态库的工程是其中的LZMALib工程,路径为:..\C\Util\LzmaLib,顶层接口封装在LZMALib.c中。

封装接口预览

最顶层封装了两个接口,用于压缩和解压,压缩参数默认封在了接口内,如果要更改需要在相应的封装工程中修改并编译出新库:

  1. // 自定义接口
  2. MY_STDAPI DefaultLzmaCompress(const unsigned char *src,const size_t srcLen,unsigned char *dest,size_t *destLen);
  3. MY_STDAPI DefaultLzmaUncompress(const unsigned char *src,size_t *srcLen,size_t *destLen);
  4. //MY_STDAPI LZMAAdd(int x); // 测试用
  1. /* LzmaLib.c -- LZMA library wrapper #include "Alloc.h" #include "LzmaDec.h" #include "LzmaEnc.h" #include "LzmaLib.h" unsigned char outProps[LZMA_PROPS_SIZE]; size_t outPropsSize = LZMA_PROPS_SIZE; MY_STDAPI LzmaCompress(unsigned char *dest,size_t *destLen,const unsigned char *src,size_t srcLen,unsigned char *outProps,size_t *outPropsSize,int level,/* 0 <= level <= 9,default = 5 */
  2. unsigned dictSize,/* use (1 << N) or (3 << N). 4 KB < dictSize <= 128 MB */
  3. int lc,/* 0 <= lc <= 8,default = 3 */
  4. int lp,/* 0 <= lp <= 4,default = 0 */
  5. int pb,/* 0 <= pb <= 4,default = 2 */
  6. int fb,/* 5 <= fb <= 273,default = 32 */
  7. int numThreads /* 1 or 2,default = 2 */
  8. )
  9. {
  10. CLzmaEncProps props;
  11. LzmaEncProps_Init(&props);
  12. props.level = level;
  13. props.dictSize = dictSize;
  14. props.lc = lc;
  15. props.lp = lp;
  16. props.pb = pb;
  17. props.fb = fb;
  18. props.numThreads = numThreads;
  19.  
  20. return LzmaEncode(dest,destLen,src,srcLen,&props,outProps,outPropsSize,0,NULL,&g_Alloc,&g_Alloc);
  21. }
  22.  
  23. MY_STDAPI LzmaUncompress(unsigned char *dest,const unsigned char *src,const unsigned char *props,size_t propsSize)
  24. {
  25. ELzmaStatus status;
  26. return LzmaDecode(dest,props,(unsigned)propsSize,LZMA_FINISH_ANY,&status,&g_Alloc);
  27. }
  28.  
  29.  
  30. // 自定义接口
  31. MY_STDAPI DefaultLzmaCompress(const unsigned char *src,size_t *destLen)
  32. {
  33. int level = 5;
  34. unsigned dictSize = 1 << 23;
  35. int lc = 3;
  36. int lp = 0;
  37. int pb = 2;
  38. int fb = 128;
  39. int numThreads = 1;
  40. return LzmaCompress(dest,&outPropsSize,level,dictSize,lc,lp,pb,fb,numThreads);
  41. }
  42.  
  43. MY_STDAPI DefaultLzmaUncompress(const unsigned char *src,size_t *destLen)
  44. {
  45. return LzmaUncompress(dest,outPropsSize);
  46. }
  47.  
  48. MY_STDAPI LZMAAdd(int x)
  49. {
  50. return x + 1;
  51. }

使用方法示例

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System.Runtime.InteropServices;
  5. using UnityEngine.UI;
  6. public class Compress : MonoBehavIoUr {
  7. public Text text = null;
  8. [DllImport("LZMA")]
  9. public static extern int LZMAAdd(int x);
  10. [DllImport("LZMA")]
  11. public static extern int DefaultLzmaCompress(byte[] src,int srcLen,byte[] dest,ref int destLen);
  12. [DllImport("LZMA")]
  13. public static extern int DefaultLzmaUncompress(byte[] src,ref int srcLen,ref int destLen);
  14. // Use this for initialization
  15. void Start () {
  16. // 压缩
  17. string input = "122333444455555666666777777788888888999999999";
  18. byte[] src = System.Text.Encoding.Default.GetBytes(input);
  19. byte[] dest = new byte[src.Length];
  20. int srcLen = src.Length;
  21. int destLen = dest.Length;
  22. int compressRes = DefaultLzmaCompress(src,dest,ref destLen); // 压缩成功compressRes会返回0,destLen的值会变成压缩后的数据长度
  23.  
  24. // 解压
  25. byte[] unsrc = new byte[destLen];
  26. for (int i = 0; i < destLen; i++) {
  27. unsrc[i] = dest[i]; // 将压缩后得到的dest数据复制到解压的src数据缓冲中
  28. }
  29. srcLen = destLen;
  30. destLen = src.Length;
  31. byte[] undest = new byte[destLen];
  32. int uncompressRes = DefaultLzmaUncompress(unsrc,ref srcLen,undest,ref destLen);
  33. string output = System.Text.Encoding.Default.GetString(undest); // 解压成功output应该和input值相同
  34. }
  35.  
  36. // Update is called once per frame
  37. void Update () {
  38.  
  39. }
  40. }

工程地址(包括编译好的各平台的库,各平台的库工程和使用示例)

https://github.com/jiangxh1992/XHLZMA

猜你在找的Windows相关文章