wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了用于Unity(windows\iOS\安卓)的纯C版LZMA压缩算法库(dll .so和.a)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_772_1@

概述

自行封装的LZMA接口库,用于unity,包括win平台的dll,安卓的so动态库和iOS的.a静态库 LZMA是目前压缩比最高的压缩算法,官方提供了多种语言的版本,unity中可以直接使用C#版,但是实际证明纯C版的压缩速度是C#版的四五倍。 封装工程介绍 LZMA(Xcode)是一个iOS的静态库工程,直接在xcode中run一下即可得到对应的.a静态库,顶层接口封装在LZMALib.c中;

封装工程介绍

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

  2. LZMA(Androidstu@R_301_2442@)是一个支持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中。

封装接口预览

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

// 自定义接口
    MY_STDAPI DefaultLzmaCompress(@H_772_37@const @H_772_37@unsigned @H_772_37@char *src,@H_772_37@const size_t srcLen,@H_772_37@unsigned @H_772_37@char *dest,size_t *destLen);
    MY_STDAPI DefaultLzmaUncompress(@H_772_37@const @H_772_37@unsigned @H_772_37@char *src,size_t *srcLen,size_t *destLen);
    //MY_STDAPI LZMAAdd(int X); // 测试用
/* 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 */
  @H_772_37@unsigned DictSize,/* use (1 << N) or (3 << N). 4 KB < DictSize <= 128 MB */
  @H_772_37@int lc,/* 0 <= lc <= 8,default = 3 */
  @H_772_37@int lp,/* 0 <= lp <= 4,default = 0 */
  @H_772_37@int pb,/* 0 <= pb <= 4,default = 2 */
  @H_772_37@int fb,/* 5 <= fb <= 273,default = 32 */
  @H_772_37@int numThreads /* 1 or 2,default = 2 */
)
{
  CLzmaEncProps props;
  LzmaEncProps_Init(&props);
  props.level = level;
  props.DictSize = DictSize;
  props.lc = lc;
  props.lp = lp;
  props.pb = pb;
  props.fb = fb;
  props.numThreads = numThreads;

  @H_772_37@return LzmaEncode(dest,destLen,src,srcLen,&props,outProps,outPropsSize,0,NULL,&g_Alloc,&g_Alloc);
}

MY_STDAPI LzmaUncompress(@H_772_37@unsigned @H_772_37@char *dest,@H_772_37@const @H_772_37@unsigned @H_772_37@char *src,@H_772_37@const @H_772_37@unsigned @H_772_37@char *props,size_t propsSizE)
{
  ELzmaStatus status;
  @H_772_37@return LzmaDecode(dest,props,(@H_772_37@unsigned)propsSize,LZMA_FINISH_ANY,&status,&g_Alloc);
}


// 自定义接口
MY_STDAPI DefaultLzmaCompress(@H_772_37@const @H_772_37@unsigned @H_772_37@char *src,size_t *destLen)
{
    @H_772_37@int level = 5;
    @H_772_37@unsigned DictSize = 1 << 23;
    @H_772_37@int lc = 3;
    @H_772_37@int lp = 0;
    @H_772_37@int pb = 2;
    @H_772_37@int fb = 128;
    @H_772_37@int numThreads = 1;
    @H_772_37@return LzmaCompress(dest,&outPropsSize,level,DictSize,lc,lp,pb,fb,numThreads);
}

MY_STDAPI DefaultLzmaUncompress(@H_772_37@const @H_772_37@unsigned @H_772_37@char *src,size_t *destLen)
{
    @H_772_37@return LzmaUncompress(dest,outPropsSizE);
}

MY_STDAPI LZMAAdd(@H_772_37@int X)
{
    @H_772_37@return x + 1;
}

使用方法示例

@H_772_37@using System.Collections;
@H_772_37@using System.Collections.Generic;
@H_772_37@using UnityENGIne;
@H_772_37@using System.Runtime.Interopservices;
@H_772_37@using UnityENGIne.UI;
@H_772_37@public @H_772_37@class Compress : MonoBehavIoUr {
    @H_772_37@public @R_178_3801@ = @H_772_37@null;
    [DllImport("LZMA")]
    @H_772_37@public @H_772_37@static @H_772_37@extern @H_772_37@int LZMAAdd(@H_772_37@int X);
    [DllImport("LZMA")]
    @H_772_37@public @H_772_37@static @H_772_37@extern @H_772_37@int DefaultLzmaCompress(@H_772_37@byte[] src,@H_772_37@int srcLen,@H_772_37@byte[] dest,@H_772_37@ref @H_772_37@int destLen);
    [DllImport("LZMA")]
    @H_772_37@public @H_772_37@static @H_772_37@extern @H_772_37@int DefaultLzmaUncompress(@H_772_37@byte[] src,@H_772_37@ref @H_772_37@int srcLen,@H_772_37@ref @H_772_37@int destLen);
    // Use this for initialization
    @H_772_37@void Start () {
        // 压缩
        @H_772_37@String input = "122333444455555666666777777788888888999999999";
        @H_772_37@byte[] src = System.Text.Encoding.Default.GetBytes(input);
        @H_772_37@byte[] dest = @H_772_37@new @H_772_37@byte[src.Length];
        @H_772_37@int srcLen = src.Length;
        @H_772_37@int destLen = dest.Length;
        @H_772_37@int compressRes = DefaultLzmaCompress(src,dest,@H_772_37@ref destLen); // 压缩成功compressRes会返回0,destLen的值会变成压缩后的数据长度

        // 解压
        @H_772_37@byte[] unsrc = @H_772_37@new @H_772_37@byte[destLen];
        @H_772_37@for (@H_772_37@int i = 0; i < destLen; i++) {
            unsrc[i] = dest[i]; // 将压缩后得到的dest数据复制到解压的src数据缓冲中
        }
        srcLen = destLen;
        destLen = src.Length;
        @H_772_37@byte[] undest = @H_772_37@new @H_772_37@byte[destLen];
        @H_772_37@int uncompressRes = DefaultLzmaUncompress(unsrc,@H_772_37@ref srcLen,undest,@H_772_37@ref destLen);
        @H_772_37@String output = System.Text.Encoding.Default.GetString(undest); // 解压成功output应该和input值相同
    }

    // update is called once per frame
    @H_772_37@void update () {

    }
}

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

https://github.com/jiangxh1992/XHLZMA

大佬总结

以上是大佬教程为你收集整理的用于Unity(windows\iOS\安卓)的纯C版LZMA压缩算法库(dll .so和.a)全部内容,希望文章能够帮你解决用于Unity(windows\iOS\安卓)的纯C版LZMA压缩算法库(dll .so和.a)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。