【步兵 工具篇】lzma算法,压缩字节流 by EOS.

本来上周就打算写的,不过孩子连续高烧,住院了一个礼拜。一个礼拜没回家,还写什么博客。
虽然花了不少钱,好在孩子也恢复过来了,继续努力,挣钱养家(ps:医院真心贵。~)

言归正传,其实今天这篇博客,是一个中间产物,因为在研究热更新,然后就想自己写一套,
下载部分用了curl库,但是文件打包,感觉用zip感觉差点意思,就作死的去研究tar.xz这种格式。
说实话几天过来,感觉到想搞点啥东西,不会英文真是费劲,只能靠悟的 = =、


LZMA

首先一开始研究的是 XZ Utils,在其主页上明显的放着LZMA SDK。
然后 点进去,直接就跑到 7z 的官网了,后来才得知7z也用的是这种算法。。。。
甚至还有对LZMA进行多线程和压缩时间优化的LZMA2算法,不过并没有提供独立lib,
自己搞一通费劲的要死,所以直接选用了LZMA。

其实我的需求并不是算法本身,而是它压缩数据的能力,所以具体算法我并没有过多的研究,
有兴趣的话可以自行研究一下。 不过大致上是对重复序列的特殊处理,可结合下图体会一下。


可以看到上图基本上将算法本身发挥到极致,5M的数据压缩到800字节左右。
而下图明显无序,所以压缩效果就并没有那么明显了。

lib只提供了,一个压缩函数和一个解压函数,十分难用,所以我进行了一下二次封装。
一些压缩解压涉及到的数据都拼到字节流里了,所以看到了十分爽朗的接口~0~


文件压缩

其实我们经常会用到以rb/wb的形式进去文件操作,一是处理起来简单,二是也算一种简单的加密。
fopen、fread、fwrite,当以二进制格式操作的时候,操作的就是字节流。
所以不难想到,我们可以把文件先读进内存,然后再压缩字节流,然后再写会硬盘。
这样就实现了对文件的压缩,反之则是文件的解压。

    cout << "\n\npart2:" << endl;Byte* buff = nullptr;size_t baseLen1 = 0;size_t baseLen2 = 0;size_t newlen = 0;FILE* fp1 = fopen("../src/EOS.tar", "rb");if (fp1){fseek(fp1, 0, SEEK_END);size_t file_len = ftell(fp1);baseLen1 = file_len;buff = new Byte[file_len];fseek(fp1, 0, SEEK_SET);fread(buff, file_len, 1, fp1);fclose(fp1);newlen = LZER->code(buff, file_len);delete[] buff;buff = new Byte[newlen];LZER->copyCodeBuff(buff, newlen);FILE* fp2 = fopen("../src/EOS.tar.xz", "wb");if (fp2){fwrite(buff, newlen, 1, fp2);fclose(fp2);delete[] buff;}}FILE* fp3 = fopen("../src/EOS.tar.xz", "rb");if (fp3){fseek(fp3, 0, SEEK_END);size_t file_len = ftell(fp3);buff = new Byte[file_len];memset(buff, 0, file_len);fseek(fp3, 0, SEEK_SET);fread(buff, file_len, 1, fp3);fclose(fp3);Byte a = buff[file_len - 1];newlen = LZER->decode(buff, file_len);delete[] buff;buff = new Byte[newlen];LZER->copySrcBuff(buff, newlen);baseLen2 = newlen;FILE* fp4 = fopen("../src/EOS_2.tar", "wb");if (fp4){fwrite(buff, newlen, 1, fp4);fclose(fp4);delete[] buff;}}


执行结果如图,不过因为把一些数据直接拼接到了字节流中,所以用winrar之类压缩软件是查看不了
tar.xz后缀的这个文件的。如果使用xz命令进行打包的话,用winrar是可以直接双击查看的。

不过不难看出这种算法,并没有涉及文件操作,所以要实现多文件或递归文件夹压缩,还要解决
tar命令的压缩和解压等问题,研究问题,总会遇到坎坷的。。。

不过可以试想一下,可以用此算法为基础做多文件的拼接的实现,因为都是字节流吗,当然可以用
一个更大的容器把他们都塞进去,记录其起始位置,和文件大小,再对其进行拆解。

比如:
fileName%startPos%fileLen【分隔符】fileName%startPos%fileLen

【FList】eos.lua%100%800!cpp/eos.cpp%901%400!...【#FList】然后后边是文件字节流...最后再来点加密解密的信息

不过中间又会遇到多少坑就不得而知了=、=


工具奉上

使用时,dll文件放到exe同级,然后调用文件 只要加上下面三句就可以了。

#include "liblzma/LzmaLib.h"
#include "liblzma/LzmaCoder.h"
#pragma comment(lib,"LZMA.lib")

有需求兄弟们,有福了,不用自己折腾了~

> git clone git@github.com:Git-EOS/lzma.git

本来想用云盘的,不值为何分享不出连接,各种404,无奈只好上git


总结

说了这是中间产物,再研究下7z的库。或者tar的解压。不过扛不住就只能换zip的库了。
毕竟cocos有一套热更代码,可以搬运,难度小上不少=。=
一起学习,一起进步~

See Again~
之前
真爱无价,欢迎打赏~

【步兵 工具篇】lzma算法,压缩字节流相关推荐

  1. python:lzma --- 用 LZMA 算法压缩

    python:lzma --- 用 LZMA 算法压缩 读写压缩文件 在内存中压缩和解压缩数据 杂项 指定自定义的过滤器链 例子 此模块提供了可以压缩和解压缩使用 LZMA 压缩算法的数据的类和便携函 ...

  2. python 压缩算法_lzma — 用 LZMA 算法压缩

    ### 导航 - [索引](../genindex.xhtml "总目录") - [模块](../py-modindex.xhtml "Python 模块索引" ...

  3. c语言lzma算法,C语言编程使用lzma SDK对7z文件简略解压缩

    有时候我们只需要单纯对lzma算法压缩的7z文件进行解压,有时需要在嵌入式设备上解压,使用p7zip虽然支持多种格式,但是不容易裁剪,使用lzma SDK是首选: 可以在这里找到各种版本:http:/ ...

  4. img图片(高效压缩)免费提供 · 在线压缩 - 工具篇

    在线压缩工具: 工具地址:压缩工具 注意事项: 100Kb ~ 200Kb压缩比:png > jpg <== 注意 拖拽式压缩.批量压缩: 小文件和大文件压缩比实际有不同的差异性(如果差别 ...

  5. PostgreSQL+PostGIS实现两坐标点之间最短路径查询算法函数(地图工具篇.12)

    听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 前置博客地址: 11.(地图工具篇)PostgreSQL+PostGIS实现最短路径分析 1.测试验证 select routi ...

  6. edHat linux光盘引导,[原]个性化Linux发行版光盘之补充——XZ(LZMA算法)

    红帽(Red Hat)从Enterprise Server 6.2 开始,启动镜像文件initrd.img 开始改用xz 工具进行压缩,这与以往版本是有区别的. 一.启动镜像initrd.img 文件 ...

  7. lzma算法_十款性能最佳的压缩算法

    数据压缩是保留相同或绝大部分数据前提下减小文件大小的过程.它的原理是消除不必要的数据或以更高效的格式重新组织数据.在进行数据压缩时,你可以选择使用有损方法或无损方法.有损方法会永久性地擦除掉一些数据, ...

  8. 蛋蛋弹车2-具有功能安全EPS系统设计(工具篇2)

    蛋蛋弹车2-具有功能安全EPS系统设计(工具篇2) 文章目录 蛋蛋弹车2-具有功能安全EPS系统设计(工具篇2) 前言 1.编译器的安装与设置 1.1 编译器环境变量的设置 1.2 windows 编 ...

  9. web前端研发工具篇

    web前端研发工具篇 一.常见前端开发IDE 1.Visual Studio Code 2.hbuilder 3.sublime text3 4.WebStorm 5.Atom 6.Dreamweav ...

最新文章

  1. Android studio 启动自学模式
  2. jQuery UI Autocomplete示例(一)
  3. 【NLP】用BERT进行机器阅读理解
  4. XCTF-高手进阶区:baby_web
  5. ClassLoader.getResourceAsStream(name);获取配置文件的方法
  6. T-SQL DML学习笔记
  7. Python与MySQL数据库连接
  8. JDBC连接数据库(Java DataBase Connectivity,java)
  9. Java BigDecimal toString()方法与示例
  10. 测试与 debug 心得
  11. 给.net初学者的一些建议(共勉之)
  12. IN改写关联注意事项!
  13. roboware studio教程_Roboware 常见操作和问题
  14. 企业CIS 系统的收集方法分析
  15. 读书笔记-opencv-极坐标变换
  16. linux kernel 报错:FATAL: kernel too old
  17. SEO优化_如何伪原创文章方法
  18. 休息时间!哪些业余活动能提升开发人员的技能?
  19. RV1126RV1109 buildroot 增加串口屏测试
  20. Java+MySQL基于SSM的二手玩具交换网站

热门文章

  1. 【CSAPP+电流+梯度下降法】九阳神功-速览1
  2. python抽荣耀水晶_王者荣耀:关于荣耀水晶免费抽的教程,会上当的一定是这3类人!...
  3. Web自动化-浏览器驱动chromedriver安装方法(mac)
  4. 各种奖学金、社团、证书、竞赛奖项…
  5. radio做选择题的单选功能
  6. 反向跟单为什么盈利率那么高
  7. gitHub有什么作用
  8. vim增加php自动补全
  9. 洗衣粉和消毒液不能混用
  10. 发货卡密怎么分账号密码?【新手必看】