有关LZF算法的相关解析文档比较少,但是Apple对LZF的开源,可以让我们对该算法进行一个简单的解析。LZFSE 基于 Lempel-Ziv ,并使用了有限状态熵编码。LZF采用类似lz77和lzss的混合编码。使用3种“起始标记”来代表每段输出的数据串。

接下来看一下开源的LZF算法的实现源码。

1.定义的全局字段:

private readonly long[] _hashTable = new long[Hsize];private const uint Hlog = 14;private const uint Hsize = (1 << 14);private const uint MaxLit = (1 << 5);private const uint MaxOff = (1 << 13);private const uint MaxRef = ((1 << 8) + (1 << 3));

2.使用LibLZF算法压缩数据:

/// <summary>/// 使用LibLZF算法压缩数据/// </summary>/// <param name="input">需要压缩的数据</param>/// <param name="inputLength">要压缩的数据的长度</param>/// <param name="output">引用将包含压缩数据的缓冲区</param>/// <param name="outputLength">压缩缓冲区的长度(应大于输入缓冲区)</param>/// <returns>输出缓冲区中压缩归档的大小</returns>public int Compress(byte[] input, int inputLength, byte[] output, int outputLength){Array.Clear(_hashTable, 0, (int)Hsize);uint iidx = 0;uint oidx = 0;var hval = (uint)(((input[iidx]) << 8) | input[iidx + 1]);var lit = 0;for (; ; ){if (iidx < inputLength - 2){hval = (hval << 8) | input[iidx + 2];long hslot = ((hval ^ (hval << 5)) >> (int)(((3 * 8 - Hlog)) - hval * 5) & (Hsize - 1));var reference = _hashTable[hslot];_hashTable[hslot] = iidx;long off;if ((off = iidx - reference - 1) < MaxOff&& iidx + 4 < inputLength&& reference > 0&& input[reference + 0] == input[iidx + 0]&& input[reference + 1] == input[iidx + 1]&& input[reference + 2] == input[iidx + 2]){uint len = 2;var maxlen = (uint)inputLength - iidx - len;maxlen = maxlen > MaxRef ? MaxRef : maxlen;if (oidx + lit + 1 + 3 >= outputLength)return 0;dolen++;while (len < maxlen && input[reference + len] == input[iidx + len]);if (lit != 0){output[oidx++] = (byte)(lit - 1);lit = -lit;dooutput[oidx++] = input[iidx + lit];while ((++lit) != 0);}len -= 2;iidx++;if (len < 7){output[oidx++] = (byte)((off >> 8) + (len << 5));}else{output[oidx++] = (byte)((off >> 8) + (7 << 5));output[oidx++] = (byte)(len - 7);}output[oidx++] = (byte)off;iidx += len - 1;hval = (uint)(((input[iidx]) << 8) | input[iidx + 1]);hval = (hval << 8) | input[iidx + 2];_hashTable[((hval ^ (hval << 5)) >> (int)(((3 * 8 - Hlog)) - hval * 5) & (Hsize - 1))] = iidx;iidx++;hval = (hval << 8) | input[iidx + 2];_hashTable[((hval ^ (hval << 5)) >> (int)(((3 * 8 - Hlog)) - hval * 5) & (Hsize - 1))] = iidx;iidx++;continue;}}else if (iidx == inputLength)break;lit++;iidx++;if (lit != MaxLit) continue;if (oidx + 1 + MaxLit >= outputLength)return 0;output[oidx++] = (byte)(MaxLit - 1);lit = -lit;dooutput[oidx++] = input[iidx + lit];while ((++lit) != 0);}if (lit == 0) return (int)oidx;if (oidx + lit + 1 >= outputLength)return 0;output[oidx++] = (byte)(lit - 1);lit = -lit;dooutput[oidx++] = input[iidx + lit];while ((++lit) != 0);return (int)oidx;}

3.

/// <summary>/// 使用LibLZF算法解压缩数据/// </summary>/// <param name="input">参考数据进行解压缩</param>/// <param name="inputLength">要解压缩的数据的长度</param>/// <param name="output">引用包含解压缩数据的缓冲区</param>/// <param name="outputLength">输出缓冲区中压缩归档的大小</param>/// <returns>返回解压缩大小</returns>public int Decompress(byte[] input, int inputLength, byte[] output, int outputLength){uint iidx = 0;uint oidx = 0;do{uint ctrl = input[iidx++];if (ctrl < (1 << 5)){ctrl++;if (oidx + ctrl > outputLength){return 0;}dooutput[oidx++] = input[iidx++];while ((--ctrl) != 0);}else{var len = ctrl >> 5;var reference = (int)(oidx - ((ctrl & 0x1f) << 8) - 1);if (len == 7)len += input[iidx++];reference -= input[iidx++];if (oidx + len + 2 > outputLength){return 0;}if (reference < 0){return 0;}output[oidx++] = output[reference++];output[oidx++] = output[reference++];dooutput[oidx++] = output[reference++];while ((--len) != 0);}}while (iidx < inputLength);return (int)oidx;}

以上是LZF算法的代码。

Apple LZF算法解析相关推荐

  1. Apple的LZF算法解析

    有关LZF算法的相关解析文档比较少,但是Apple对LZF的开源,可以让我们对该算法进行一个简单的解析.LZFSE 基于 Lempel-Ziv ,并使用了有限状态熵编码.LZF采用类似lz77和lzs ...

  2. 回归算法分类,常用回归算法解析

    回归算法分类,常用回归算法解析 回归是数学建模.分类和预测中最古老但功能非常强大的工具之一.回归在工程.物理学.生物学.金融.社会科学等各个领域都有应用,是数据科学家常用的基本工具. 回归通常是机器学 ...

  3. CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)

    CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020) 目标检测:FCOS(CVPR 2019) 目标检测算法FCOS(FCOS: ...

  4. ios5中apple增加了解析JSON的api——NSJSONSerialization。

    ios5中apple增加了解析JSON的api--NSJSONSerialization.网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON.TouchJSON.YA ...

  5. 10没有基于策略的qos_分布式QoS算法解析

    QoS对于服务多租户多业务的整体系统来说,不管对网络还是存储,都格外重要,没有QoS,会造成不同租户及业务之间对资源的抢占,用户A用爽了,用户B却遭了殃,频频投诉,这是系统管理员最头疼的事情.我们今天 ...

  6. python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析

    本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...

  7. 脑机接口主流算法解析课程视频汇总

    目录 讲座1--SSVEP算法解析 讲座2--ERP/P300算法解析 讲座3--运动想象算法解析 讲座4--情感脑机接口算法解析 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 .QQ交流 ...

  8. yolo类检测算法解析——yolo v3

    原文:https://www.cnblogs.com/cvtoEyes/p/8608205.html yolo类检测算法解析--yolo v3 计算机视觉的发展史可谓很长了,它的分支很多,而且理论那是 ...

  9. 【机器学习】通俗的元胞自动机算法解析和应用

    [机器学习]通俗的元胞自动机算法解析和应用 文章目录 1 元胞自动机的定义 2 元胞自动机的组成 3 元胞自动机的特征 4 Python实现元胞自动机(生命游戏) 5 总结 6 Github(华盛顿州 ...

最新文章

  1. nginx 修改html header,nginx 安全笔记 (修改nginx的header信息和错误显示版本号)
  2. Delphi 正则表达式之TPerlRegEx 类的属性与方法(3): Start、Stop
  3. require.js基本用法
  4. python可变参数记录
  5. Spring整合Mongodb,Maven的依赖,Spring配置,MongoDB的公共操作类,使用SpringMVC的Controller进行测试并返回结果的案例
  6. Java I/O NIO学习
  7. ES6:Set数据结构
  8. c语言有趣的编程代码,一个有趣的小程序
  9. 【Java考试】易错知识点,期末考试踩坑题
  10. php7中require_once,php require_once的使用方法总结
  11. Java四大元注解介绍
  12. 【Scratch-声音模块】音量控制
  13. 西部世界分析:人民网点名IPFS 分布式存储打开千亿级市场
  14. 调整bandizip压缩参数获得最大压缩效果
  15. 机器学习理论之(1):概率分布,信息熵,朴素贝叶斯
  16. python如何开发网站_如何用Python写一个小网站?
  17. [概念]像素,分辨率
  18. 2017第一届河北省大学生程序设计竞赛题解
  19. utf-8中一个汉字是3个字节,你知道吗?
  20. 什么是私有云?您应该知道的 6 个优势

热门文章

  1. IEEE xplore论文免费下载
  2. gensim Dictionary 去除某个词 gensim.corpora.dictionary.Dictionary
  3. C#Windows学生信息管理系统
  4. linux用命令下载图片,Linux命令行中采集指定页面的图片地址及图片下载
  5. 更新第十三讲 2021秋季班学而思培优 二年级三年级四年级五年级数学
  6. 网页上如何禁止复制(如何复制xx网站上的内容)
  7. h3c服务器r4900清空配置信息,H3C R4900 G3服务器HDM初始化配置
  8. 模拟电子入门需要掌握的点(上)
  9. 实现xxxxxxx系统六大质量属性战术
  10. FileNotFoundException open failed: XXXXXXX EPERM (Operation not permitted)的坑