Apple LZF算法解析
有关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算法解析相关推荐
- Apple的LZF算法解析
有关LZF算法的相关解析文档比较少,但是Apple对LZF的开源,可以让我们对该算法进行一个简单的解析.LZFSE 基于 Lempel-Ziv ,并使用了有限状态熵编码.LZF采用类似lz77和lzs ...
- 回归算法分类,常用回归算法解析
回归算法分类,常用回归算法解析 回归是数学建模.分类和预测中最古老但功能非常强大的工具之一.回归在工程.物理学.生物学.金融.社会科学等各个领域都有应用,是数据科学家常用的基本工具. 回归通常是机器学 ...
- CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)
CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020) 目标检测:FCOS(CVPR 2019) 目标检测算法FCOS(FCOS: ...
- ios5中apple增加了解析JSON的api——NSJSONSerialization。
ios5中apple增加了解析JSON的api--NSJSONSerialization.网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON.TouchJSON.YA ...
- 10没有基于策略的qos_分布式QoS算法解析
QoS对于服务多租户多业务的整体系统来说,不管对网络还是存储,都格外重要,没有QoS,会造成不同租户及业务之间对资源的抢占,用户A用爽了,用户B却遭了殃,频频投诉,这是系统管理员最头疼的事情.我们今天 ...
- python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析
本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...
- 脑机接口主流算法解析课程视频汇总
目录 讲座1--SSVEP算法解析 讲座2--ERP/P300算法解析 讲座3--运动想象算法解析 讲座4--情感脑机接口算法解析 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 .QQ交流 ...
- yolo类检测算法解析——yolo v3
原文:https://www.cnblogs.com/cvtoEyes/p/8608205.html yolo类检测算法解析--yolo v3 计算机视觉的发展史可谓很长了,它的分支很多,而且理论那是 ...
- 【机器学习】通俗的元胞自动机算法解析和应用
[机器学习]通俗的元胞自动机算法解析和应用 文章目录 1 元胞自动机的定义 2 元胞自动机的组成 3 元胞自动机的特征 4 Python实现元胞自动机(生命游戏) 5 总结 6 Github(华盛顿州 ...
最新文章
- nginx 修改html header,nginx 安全笔记 (修改nginx的header信息和错误显示版本号)
- Delphi 正则表达式之TPerlRegEx 类的属性与方法(3): Start、Stop
- require.js基本用法
- python可变参数记录
- Spring整合Mongodb,Maven的依赖,Spring配置,MongoDB的公共操作类,使用SpringMVC的Controller进行测试并返回结果的案例
- Java I/O NIO学习
- ES6:Set数据结构
- c语言有趣的编程代码,一个有趣的小程序
- 【Java考试】易错知识点,期末考试踩坑题
- php7中require_once,php require_once的使用方法总结
- Java四大元注解介绍
- 【Scratch-声音模块】音量控制
- 西部世界分析:人民网点名IPFS 分布式存储打开千亿级市场
- 调整bandizip压缩参数获得最大压缩效果
- 机器学习理论之(1):概率分布,信息熵,朴素贝叶斯
- python如何开发网站_如何用Python写一个小网站?
- [概念]像素,分辨率
- 2017第一届河北省大学生程序设计竞赛题解
- utf-8中一个汉字是3个字节,你知道吗?
- 什么是私有云?您应该知道的 6 个优势
热门文章
- IEEE xplore论文免费下载
- gensim Dictionary 去除某个词 gensim.corpora.dictionary.Dictionary
- C#Windows学生信息管理系统
- linux用命令下载图片,Linux命令行中采集指定页面的图片地址及图片下载
- 更新第十三讲 2021秋季班学而思培优 二年级三年级四年级五年级数学
- 网页上如何禁止复制(如何复制xx网站上的内容)
- h3c服务器r4900清空配置信息,H3C R4900 G3服务器HDM初始化配置
- 模拟电子入门需要掌握的点(上)
- 实现xxxxxxx系统六大质量属性战术
- FileNotFoundException open failed: XXXXXXX EPERM (Operation not permitted)的坑