CN117200805B - 一种mcu的低内存占用的压缩和解压方法及装置 - Google Patents
一种mcu的低内存占用的压缩和解压方法及装置 Download PDFInfo
- Publication number
- CN117200805B CN117200805B CN202311468413.8A CN202311468413A CN117200805B CN 117200805 B CN117200805 B CN 117200805B CN 202311468413 A CN202311468413 A CN 202311468413A CN 117200805 B CN117200805 B CN 117200805B
- Authority
- CN
- China
- Prior art keywords
- byte
- tcw
- node
- data stream
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 74
- 230000006835 compression Effects 0.000 title claims abstract description 46
- 238000007906 compression Methods 0.000 title claims abstract description 46
- 230000006837 decompression Effects 0.000 title claims abstract description 18
- 238000004422 calculation algorithm Methods 0.000 claims abstract description 23
- 238000006243 chemical reaction Methods 0.000 claims abstract description 17
- 230000008569 process Effects 0.000 claims abstract description 7
- 230000001174 ascending effect Effects 0.000 claims description 6
- 239000011159 matrix material Substances 0.000 claims description 6
- 230000009466 transformation Effects 0.000 claims description 5
- 108091026890 Coding region Proteins 0.000 claims description 3
- 239000006227 byproduct Substances 0.000 claims description 3
- 238000006073 displacement reaction Methods 0.000 claims description 3
- 239000013589 supplement Substances 0.000 claims description 3
- 238000010586 diagram Methods 0.000 description 16
- 238000004364 calculation method Methods 0.000 description 2
- 230000009467 reduction Effects 0.000 description 2
- 230000002441 reversible effect Effects 0.000 description 2
- 238000003491 array Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000011550 data transformation method Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 239000000047 product Substances 0.000 description 1
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明涉及固件差分数据的压缩和解压技术领域,具体涉及一种MCU的低内存占用的压缩和解压方法及装置;方法包括以下步骤:获取原始数据流;将原始数据流经过平整处理得到平整数据流;采用基于桶排序法、基于下标法的BWT变换或基于游程编码思想的重复字节压缩法对平整数据流进行压缩处理,得到优化后的字节数组;根据字典树算法对优化后的字节数组进行处理,得到原始数据流对应的huffman码表;根据huffman码表对优化后的字节数组进行编码,得到压缩文件。采用本发明的方法,过程中使用较少内存消耗,压缩和解压差分数据,以实现减少差分包体积和硬件资源不足的MCU芯片具备解压能力。
Description
技术领域
本发明涉及固件差分数据的压缩和解压技术领域,具体涉及一种MCU的低内存占用的压缩和解压方法及装置。
背景技术
使用主流压缩工具压缩差分数据可以获得较好的压缩效果,但是主流压缩工具对RAM要求较高,比如gzip要求至少64k内存,某些RAM小于64K的MCU无法使用此类压缩工具。同时,升级程序集成主流压缩工具后,升级程序的体积会增加15k,这对于某些低ROM的MCU将无法搭载升级程序。
发明内容
针对现有技术中主流压缩工具对RAM要求较高,低ROM的MCU将无法搭载升级程序的问题,提供了一种低内存占用、轻量级的压缩和解压方案,尽量满足压缩率的前提下,利用分块压缩、减少字典等方法,减少解压时内存占用,因此,提出了一种MCU的低内存占用的压缩和解压方法及装置,为MCU升级程序提供更高的可用性和可移植性。
为了实现上述发明目的,本发明提供了以下技术方案:
一种MCU的低内存占用的压缩方法,包括以下步骤:
获取原始数据流;
将所述原始数据流经过平整处理得到平整数据流;
依次采用基于下标法的BWT变换和基于桶排序法将相同的字节聚拢;得到预处理的数据流;
基于游程编码思想的重复字节压缩法对所述预处理的数据流进行压缩处理,得到优化后的字节数组;
根据字典树算法对优化后的字节数组中重复的数据结构进行压缩,并得到所述原始数据流对应的huffman码表;
根据所述huffman码表对所述优化后的字节数组进行编码,得到压缩文件。
作为优选方案,所述平整处理包括以下步骤:
将所述原始数据流划分为若干字节,为每个字节创建三倍长度的字节数组;
遍历每个字节,若字节的值小于或等于16,则将字节存入字节数组,否则,按照得到16加上字节的值除16取整和字节的值对16取余的值计算后,将得到的数值存入字节数组;
根据预先设置的数据转换表格table1,将所述字节数组中的数进行转换,得到平整数据流。
作为优选方案,基于桶排序法主要包括以下步骤:
在平整数据流的最后增加10,并生成BWT-node列表;
设初始化变量为size,size=0,在BWT-node列表中size指向列数值相同且连续的行视为一个桶,对所有桶进行降序排序;
重复以下步骤,直到无法产生新桶:
size= size +1,对桶内size指向列数值相同且连续的行视为新桶,对新桶进行降序排序。
作为优选方案,基于下标法的BWT变换主要包括以下步骤:
在平整数据流的最后增加10,并生成BWT-node列表;
在BWT-node列表中寻找字节与字节相邻且字节值相同的字节段的起始点和结束点,得到该值的起始点和结束点;接着将起始点和结束点间的节点的值赋值为node.(idx+size);对起始点和结束点之间的节点的值进行升序排序;利用递归,重复上述操作,传入递归方法的size+1,直到所有节点排序完毕,得到BWT矩阵的起始列和末尾列。
作为优选方案,基于游程编码思想的重复字节压缩法包括以下步骤:
经过平整处理后的数据流为RDS-F-BB,RDS-F-BB需要压缩的字节有9位,顺序遍历RDS-F-BB中每个字节i,i连续出现n次,若n≤2,将n*i存入TCB中;若n>2,将i和11存入TCB,将n存入TLB;
创建字节数组LZCB和字节数组LZDB;定义虚拟窗口TCW,TCW在TCB自左向右滑动,TCW左边区域为TCW-L,TCW右边区域为TCW-R;TCW长度为32B,为编码区;TCW-L为已编码区;TCW-R为未编码区;利用LZSS算法,TCW在TCW-L寻找重复的结构信息并进行压缩,包括: TCW位于TCB最左端;设TCW-L与TCW存在重复结构信息长度为n,重复结构信息与TCW的距离为d,若n=0,TCW在TCB上右移一个字节,LZCB存入TCW第一个字节;若0<n<2,TCW在TCB上右移n个字节,LZCB存入TCW前n个字节;若n>2,TCW在TCB上右移n个字节,LZCB存入(12+n),LZDB存入d,TCW移出TCB时结束压缩,n表示TCW有多少个字节的重复数据,d表示TCW中的重复数据距离上一次最近出现的数据的字节数,TCW是游程编码缓冲器虚拟窗口,TCB是游程编码缓冲区,DLB是距离和长度缓存器,TLB是游程长度缓冲区。
作为优选方案,根据字典树算法对优化后的字节数组中重复的数据结构进行压缩包括以下步骤:
对TCB进行LZSS编码,将TCB每个字节和其后31个字节作为子串TCB-F,将所有TCB-F生成一颗字典树,每个节点需附带一串坐标信息,出现在此节点的字节的在TCB的下标,TCW在TCW-L寻找重复结构信息,将TCW代入字典树,寻找符合TCW的路径,判断符合TCW的路径上的节点坐标信息是否小于TCW在TCB的位移,可得到TCW在TCW-L匹配得到的最长重复结构信息,同时也得到了编码副产物LZDB、TLB;
顺序遍历LZDB和TLB每个字节i,若字节的值i小于或等于32,则将字节存入DLB,若字节的值i大于32,按照字节的值除32取整加上32和字节的值对32取余的值计算后,将得到的数值存入DLB;
基于DLB、LZCB和码表table2,得到huffman码表,根据huffman码表创建压缩文件。
作为优选方案,基于DLB、LZCB和码表table2,得到huffman码表,根据huffman码表创建压缩文件,包括以下步骤:
定义码表table2,声明结构体Huffman_Node,结构体Huffman_Node字段包含code、extra,code表示数据i在table2的编码值,extra表示还原数据i需要额外使用的字位数;分别记录table2中的code和extra,将数据i=21代入table2,得到code=7和extra=3;
Huffman_Node.code对应table2的code,Huffman_Node.extra对应table2的extra,Huffman_Node.extra为code的补充;创建Huffman_Node数组HNL,HNL长度为DLB和LZCB长度之和;创建字节数组HTMap,长度为12,HTMap每个下标对应一个code;HTMap记录每个code出现次数;创建字节数组HT,长度为13,记录huffman码表,其中HT[0]表示DLB和LZCB出现码字个数;
依次顺序遍历DLB和LZCB的每个字节i,将i代入table2得到对应的code和extra,生成一个Huffman_Node节点n并记录code和extra,将n存入HNL,HTMap对应节点数值加1;遍历结束,得到HTMap和HNL,遍历HTMap n次,n最多为12次,每次提取其内最大数字对应的下标,将下标从HT[1]开始依次存入HT中,直到HTMMap最大值为0;HT数组表示DLB和LZCB的每个字节对应code出现次数降序排序;HT[0]记录原HTMap中非0字节个数;根据HT生成huffman码表;
将huffman码表中每个字节写入压缩文件,每个字节位宽为6;顺序遍历DLB和LZCB的每个字节,记为v;在HNL找到v对应节点,记为node;在huffman码表找到对应下标,记为idx;向压缩文件写入node.code且位宽为idx、v取余node.extra且位宽为node.extra,得到压缩文件。
作为优选方案,码表table2为:
基于相同的构思还提出了一种MCU的低内存占用的解压方法,包括以下步骤:
采用上述所述的一种MCU的低内存占用的压缩方法进行压缩,得到压缩文件;
从所述压缩文件中获取待解压数据流;
根据huffman码表,采用字典树算法的逆运算对所述待解压数据流进行解码;得到优化后的字节数组;
采用游程编码思想的重复字节压缩法的逆运算对所述优化后的字节数组进行解压,得到预处理的数据流;
基于桶排序法和基于下标法的BWT变换的逆运算,对所述预处理的数据流进行处理,得到平整数据流;
对所述平整数据流进行平整处理的逆运算,得到原始数据流。
基于相同的构思还提出了一种MCU的低内存占用的压缩和解压装置,包括至少一个处理器,以及与所述至少一个处理器通信连接的存储器;所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行上述任一项所述的方法。
与现有技术相比,本发明的有益效果:
采用本发明的方法,过程中使用较少内存消耗,压缩和解压差分数据,以实现差分包体积的减少,并使得硬件资源不足的MCU芯片具备解压能力。
附图说明
图1为实施例1中的一种MCU的低内存占用的压缩方法流程图;
图2为实施例1中的本发明方法涉及术语列表;
图3为实施例1中平整数据流的流程图;
图4为实施例1中的顺序遍历每个字节进行平整计算的示意图;
图5为实施例1中的平整数据流所用的转换数据表格;
图6为实施例1中的拆解字节数组RDS-F-BB的示意图;
图7为实施例1中桶排序进行变换示意图;
图8为实施例1中的使用下标法进行BWT变换的示意图;
图9为实施例1中的游程编码将平整数据流中大量重复的字节进行压缩的示意图;
图10为实施例1中的窗口移动示意图;
图11为实施例1中的LZ编码示意图;
图12为实施例1中的字典树示意图;
图13为实施例1中的码表table2;
图14为实施例1中的huffman树结构示意图。
具体实施方式
下面结合实施例及具体实施方式对本发明作进一步的详细描述。但不应将此理解为本发明上述主题的范围仅限于以下的实施例,凡基于本发明内容所实现的技术均属于本发明的范围。
实施例1
一种MCU的低内存占用的压缩方法流程图如图1所示,概括地说,包括以下步骤:
获取原始数据流;
将所述原始数据流依次经过平整处理得到经过平整处理后的数据流;
采用基于桶排序法和基于下标法的BWT变换将相同的字节聚拢;得到预处理的数据流;
基于游程编码思想的重复字节压缩法对所述预处理的数据流进行压缩处理,得到优化后的字节数组;
根据字典树算法对优化后的字节数组中重复的数据结构进行压缩,并得到所述原始数据流对应的huffman码表;
根据所述huffman码表对所述优化后的字节数组进行编码,得到压缩文件。
具体方法如下:
本发明的方法参考zip压缩算法,结合BWT变换、游程编码、Huffman编码等,结合无损压缩和解压BSDiff差分算法得到的差分数据。BSDiff作为差量更新算法,对比新文件与旧文件产生的control stream、diff stream、extra stream,diffstream中包含大量的0,可被高效压缩。本文涉及一些术语,详见附图2。
第一步,获取用于压缩的原始数据,输入的原始数据流为RDS,即BSDiff生成的Control Stream、Diff Stream和Bits Stream,考虑MCU硬件的局限性,一次性无法解压较多数据,故将RDS划分为长度为1024B的若干段流,MCU每次只解压1KB数据,降低MCU解压数据时对硬件资源的依赖。
第二步,将原始数据流转换为平整数据流。由上述内容可知,一段RDS(下文称RDS-F)由1024个字节组成,每个字节的取值范围为0~255,RDS-F可能存在大量的0且数据波动较大。为“平整”RDS-F,创建长度为RDS-F长度三倍的字节数组(RDS-F-BB),顺序遍历RDS-F每个字节i,若i≤16,i存入RDS-F-BB;若i>16,RDS-F-BB依次存入(16+i/16)和(i%16),平整数据流的流程图见图3所示,顺序遍历RDS-F每个字节进行平整计算的示意图如图4所示。可知,RDS-F-BB由0~32组成,进一步拆解RDS-F-BB,制定table1(平整数据流所用的转换数据表格如图5所示),在RDS-F-BB末尾添加65,顺序遍历RDS-F-BB的每个字节m,将m代入table1获取其对应的code和extra,将m替换为code,将extra添加到RDS-F-BB末尾,重复上述操作,直到m=65,将65改为9,拆解RDS-F-BB的示意图如图6所示。可知,此时RDS-F-BB由0~9组成,存在大量重复字节,较为平整。
第三步,采用基于桶排序法和基于下标法的BWT变换将相同的字节聚拢;得到预处理的数据流。
BWT算法为现有算法。BWT是一种以数据块为操作对象的可逆的数据变换方法,其核心思想是对字符串轮转后得到的字符矩阵进行排序和变换。它本身不会减少数据量,但是变换后的数据更容易压缩,所以BWT是对数据进行压缩的预处理。用现有的BWT变换,过程为:RDS-F-BB末尾添加10,认为10是最小数,按照BWT算法,生成RDS-F-BB子串矩阵并排序,获得经过BWT变换后的RDS-F-BB。可知,此时RDS-F-BB由0~10组成。
本发明的方法改进上述BWT变换,使用下标法进行BWT变换,极大降低BWT变换带来的内存消耗。申明结构体BWT_Node,其包含数据idx、value,idx为node在原数据流的下标,value为node当前代表的值,初值为0,得到BWT-O。可知BWT-O长度为RDS-F-BB长度加1。桶排序进行变换工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),桶排序进行变换示意图如图7所示,具体步骤为:
初始化变量size,size=0。size指向列数值相同且连续的行视为一个桶(记为Bucket1、Bucket2、Bucket3等),对所有桶进行降序排序。
size=1,对桶内size指向列数值相同且连续的行视为新桶,对新桶进行降序排序。
重复上述操作,直到无法产生新桶。
定义结构体node,其属性为idx、size和value。
使用下标法进行BWT变换的示意图如图8所示,实现思路为:寻找BWT-O中字节与字节相邻且字节值(value)相同的的起始点和结束点,接着对起始点和结束点间的节点的value( value为node的属性,字节的值赋予node.value)赋值为node.(idx+size),对起始点和结束点之间的node进行升序排序。利用递归,重复上次操作,传入递归方法的size+1。直到所有节点排序完毕,即可得到BWT矩阵的起始列和末尾列。原始数据排序经过BWT变换得到BWT矩阵,其起始列为原始数据的升序排序,末尾列是我们期望得到的数据。升序排序末尾列得到起始列,又可通过起始列和末尾列还原原始数据。起始列和末尾列在BWT变换中有重大意义。
第四步,基于游程编码思想的重复字节压缩法对所述预处理的数据流进行压缩处理,得到优化后的字节数组。
利用游程编码思想,压缩RDS-F-BB中大量重复的字节,创建字节数组TCB长度为2048和创建字节数组TLB长度为2048。由上文可知,RDS-F-BB需要压缩的字节有0~8,共9位,顺序遍历RDS-F-BB中每个字节i,i连续出现n次,若n<=2,将字节i直接存入TCB中;若n>2,将i和11存入TCB,将n存入TLB。游程编码将平整数据流中大量重复的字节进行压缩的示意图9,6这个字节连续出现了3次,n=3,则将6和11存入TCB中,将3存入TLB中;2这个字节连续出现了4次,n=4,则将2和11存入TCB中,将4存入TLB中,就将重复直接进行了压缩。可知,TCB由0~11组成,TLB由0~1024组成。
在上一步游程编码的基础上,还增加了虚拟窗口,进一步进行重复字节的压缩,具体步骤如下:
创建字节数组LZCB长度为2048和字节数组LZDB长度为2048,定义虚拟窗口TCW,TCW在TCB自左向右滑动,TCW左边区域为TCW-L,TCW右边区域为TCW-R。TCW长度为32B,为编码区;TCW-L为已编码区;TCW-R为未编码区。参考LZSS算法,TCW在TCW-L寻找重复的结构信息并进行压缩。起始条件,TCW位于TCB最左端。设TCW-L与TCW存在重复结构信息长度为n,重复结构信息与TCW的距离为d,若n=0,TCW右移1,LZCB存入TCW第一个字节;若0<n<2,TCW右移n,LZCB存入TCW前n个字节;若n>2,TCW右移n,LZCB存入(12+n),LZDB存入d。结束条件,TCW移出TCB。可知,LZCB由0~35组成,LZDB由0~1024组成,实际上LZDB的数字会比较小。窗口移动示意图见图10,结果LZ编码示意图见图11。如图10,程序在TCW-L中寻找TCW的重复数据结构。如图11,存入12为TCW起始位置,71763为重复数据结构,上一次重复的71763与当前TCW相隔12个字节,所以LZDB存入12;又因为71763长度为5,所以LZCB存入(12 + 5)。之后LZDB存入11也是一样的逻辑。
第五步,根据字典树算法对优化后的字节数组中重复的数据结构进行压缩,并得到所述原始数据流对应的huffman码表。
BWT变换是将相同的字节聚拢,其为压缩的预处理,游码编程压缩重复且相邻的字节,而LZSS编码是压缩重复的数据结构,例如,数据结构是指如图11中所示的重复的71763。
对TCB进行LZSS编码,用TCB生成一颗字典树,前文提到TCW长度为32字节,所以寻找的重复数据结构最长为32字节。相邻的32个字节作为一个子串。将TCB拆分为N个子串(子串长度不大于32字节),利用N个子串生成字典树。LZCB和LZDB是对TCB进行LZSS编码的产物,LZSS编码过程使用字典树算法。
字典树从跟节点出发,到达某个指定的叶子节点可以构成一个TCB-F。字典树本身只记录出现过的子串结构,为满足上述需求,每个节点需附带一串坐标信息,出现在此节点的字节的在TCB的下标。TCW在TCW-L寻找重复结构信息,将TCW代入字典树,寻找符合TCW的路径,判断符合TCW的路径上的节点坐标信息是否小于TCW在TCB的位移,可得到TCW在TCW-L匹配得到的最长重复结构信息。
字典树示意图见图12。图12为示意图,其子串长度为5。拆分007763611331921143211,可得到00776,07763,77636等等子串。图12中R节点意味Root节点(跟节点),R节点->0节点->0节点->7节点->7节点-6节点,依次类推,可得到整个数据的结构图。每个节点记录其在原数据出现的下标,比如图12,R节点为第一层节点,第二层7节点出现两次,其对应的下标分别为2、3,所以第二层7节点的坐标串为2、3。节点树为原数据拆分后子串结构,当每个节点带上坐标串信息时,节点树就为整个原数据的结构信息。
假如原始数据为00776361133192114321152430077613254,可见重复数据结构为00776,第一次出现时下标为0(此下标为重复结构第一个字节的下标,后同),第二次出现的下标为n。当TCW指向n时,将TCW代入字典树,可得知字典树00776的路径,获取该路径各个节点的下标,查看是否有连续的下标,有则表示00776为重复结构;无则表示TCW前的字节中没有00776。
字典树为现有算法,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
此时LZDB、TLB为编码副产物,创建字节字符串DLB长度为1024,按照上文思想,对LZDB、TLB“平整”处理。可知LZDB、TLB由0~1024组成,顺序遍历LZDB和TLB每个字节i,若i<=32,将i存入DLB;若i>32,将(32+i/32)和(i%32)存入DLB,即将数据i除以32的值取整的值加上32和数据i对32取余的值存入DLB中。遍历结束即可得到由0~64组成的DLB。
接下来,对最终得到DLB和LZCB进行统计(LZDB + TLB 得到DLB),得到huffman表,具体包括以下步骤:
分别在DLB和LZCB末尾添加65,作为流结束标志。定义table2(见附图13)。声明结构体Huffman_Node,字段包含code、extra。Huffman_Node.code对应table2的code,Huffman_Node.extra对应table2的extra,Huffman_Node.extra为code的补充。创建Huffman_Node数组HNL,长度为DLB和LZCB长度之和。创建字节数组HTMap,长度为12,HTMap每个下标对应一个code,idx=0对应code=0,以此类推。HTMap记录每个code出现次数。创建字节数组HT,长度为13,记录huffman码表,其中HT[0]表示DLB和LZCB出现码字个数。依次顺序遍历DLB和LZCB的每个字节i,将i代入table2得到对应的code和extra,如果数据i等于32,得到code=9,extra=4,生成一个Huffman_Node节点并记录code和extra,将节点存入HNL,HTMap对应节点数值加1。遍历结束,得到HTMap和HNL。遍历HTMap的n次,n最多为12次,每次提取其内最大数字对应的下标,将下标从HT[1]开始依次存入HT中,直到HTMMap最大值为0。HT数组表示DLB和LZCB的每个字节对应code出现次数降序排序。HT[0]记录原HTMap中非0字节个数。根据HT生成huffman树,huffman树结构示意图见图14,可知HT[1]的huffmancode为0(code 0出现次数最多),HT[2]的huffman code为10,以此类推。
第六步,根据所述huffman码表对所述优化后的字节数组进行编码,得到压缩文件。
经上述操作得到huffman表和HNL,创建压缩文件,将HT(huffman表)中每个字节写入压缩文件,每个字节位宽为6;顺序遍历DLB和LZCB的每个字节,记为v;在HNL找到v对应节点,记为node;在HT找到对应下标,记为idx;向压缩文件写入node.code且位宽为idx、v取余node.extra且位宽为node.extra。
改进上文描述的步骤,保存编码一段RDS-F得到的DLB和LZCB,直至所有RDS-F编码完成,对所有所得的DLB和LZCB进行huffman编码,最后得到压缩文件。相比上述,改进后只记录一个HT,而且总体每个code编码更合理。
实施例2
解码即为编码的逆流程。首先从压缩数据中的huffman表。设解码时输入的数据流为DDS,读入6位得到n,n为码字个数,读入n*6位得到所有码字,生成HT。与上文相同,HT[0]位码字个数。创建长度为n的Huffman_Node数组,记为HNL,遍历HT的每个字节i,依据HT[i]和table2得到i.bits, i.code为HT[i]。从压缩数据中提取LZCB和DLB。创建长度为1024的字节数组LZCB和长度为1024的字节数组DLB。定义变量code,重复执行下述步骤,直到code=65。
步骤一:从DDS读入1位,记为_v。
步骤二:code=code<<1 + _v。
步骤三:遍历HNL的每个节点n,若n.code等于code,从DDS读入n.bits位,记为extra,换算code得到value,将(value+extra)存入LZCB;若HNL中没有code,重复步骤1。
经过上述步骤,得到LZCB。重复上述步骤,将数据存入DBL中。
移除LZCB和DLB末尾的65,得到未压缩的LZCB和DLB原始数据。
根据DLB获取LZDB和TLB。创建字节数组DLB-O,长度与DBL相同。遍历DBL的每个字节i,设i下个字节为n,若i>32,DBL-O存入(32*(i-32)+n);若i<=32,DBL-0存入i。DLB-O由LZDB和TLB组成。
根据LZCB和LZDB还原未经过LZSS压缩的数据,计算LZSS压缩的数据流长度,记为lzss-len。创建长度为lzss-len的字节数组,记为TCB。顺序遍历LZCB的每个字节i,若i<12,TCB存入i;若i>=12,记n=i-12,从LZDB获得一字节d,TCB存入i前d个字节处的n个字节。经此操作,可知TCB由0~11组成。根据TCB和TLB,还原未经过游程编码压缩的数据,计算游程编码压缩的数据流长度,记为t-len。创建长度为t-len的字节数组,记为RDS-F-BB。顺序遍历TCB的每个字节i,若i<11,RDS-F-BB存入i;若i等于11,从TLB获得一字节n,记i前字节为ip,将n个ip存入RDS-F-BB。经此操作,得到经过BWT变换的数据,可知RDS-F-BB由0~10组成。根据BWT的LF算法,对RDS-F-BB进行逆排序,并移除末尾的10。经此操作,RDS-F-BB有0~9组成。确定RDS-F-BB中9的位置,记为idx;遍历RDS-F-BB的0~idx的每个字节i,i代入table1得到对应的范围range和从idx后获取i对应的extra,依据range和extra得到value,将i改为value。创建字节数组RDS-F,长度为idx。顺序遍历RDS-F-BB的0~idx的每个字节i,若i<=16,RDS-F存入i;若i>16,记i下个字节为next,RDS-F存入((i-16)*16+next)。经上述操作,可得原数据片段,完成数据解压缩。
经上述压缩方式,将5.6K的diff数据压缩到500B内,实现压缩和解压算法体量较小且压缩率较高。
最后应说明的是:以上详细描述的实施例仅为该发明的较佳实践,并不能以此来限定本发明的权利范围,对前述各实施例所记载的技术方案进行等同替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围,其均应涵盖在本发明的权利要求和说明书的范围当中。
Claims (10)
1.一种MCU的低内存占用的压缩方法,其特征在于,包括以下步骤:
获取原始数据流;
将所述原始数据流经过平整处理得到平整数据流;
依次采用基于下标法的BWT变换和基于桶排序法将相同的字节聚拢;
得到预处理的数据流;基于游程编码思想的重复字节压缩法对所述预处理的数据流进行压缩处理,得到优化后的字节数组;
根据字典树算法对优化后的字节数组中重复的数据结构进行压缩,并得到所述原始数据流对应的huffman码表;
根据所述huffman码表对所述优化后的字节数组进行编码,得到压缩文件;
所述采用基于下标法的BWT变换包括以下步骤:
寻找BWT-O中字节与字节相邻且字节值相同的起始点和结束点,接着对起始点和结束点间的节点的字节值赋值为node.(idx+size),对起始点和结束点之间的结构体进行升序排序;利用递归,重复上次操作,传入递归方法的size+1,直到所有节点排序完毕,即可得到BWT矩阵的起始列和末尾列,末尾列是变换后得到的数据。
2.如权利要求1所述的一种MCU的低内存占用的压缩方法,其特征在于,所述平整处理包括以下步骤:
将所述原始数据流划分为若干字节,为每个字节创建三倍长度的字节数组;
遍历每个字节,若字节的值小于或等于16,则将字节存入字节数组,否则,按照字节的值除16取整加上16和字节的值对16取余的值计算后,将得到的数值存入字节数组;
根据预先设置的数据转换表格table1,将所述字节数组中的数进行转换,得到平整数据流。
3.如权利要求2所述的一种MCU的低内存占用的压缩方法,其特征在于,基于桶排序法主要包括以下步骤:
在平整数据流的最后增加10,并生成BWT-node列表;
设初始化变量为size,size=0,在BWT-node列表中size指向列数值相同且连续的行视为一个桶,对所有桶进行降序排序;
重复以下步骤,直到无法产生新桶:
size= size +1,对桶内size指向列数值相同且连续的行视为新桶,对新桶进行降序排序。
4.如权利要求3所述的一种MCU的低内存占用的压缩方法,其特征在于,基于下标法的BWT变换主要包括以下步骤:
在平整数据流的最后增加10,并生成BWT-node列表;
在BWT-node列表中寻找字节与字节相邻且字节值相同的字节段的起始点和结束点,得到该值的起始点和结束点;接着将起始点和结束点间的节点的值赋值为node.(idx+size);对起始点和结束点之间的节点的值进行升序排序;利用递归,重复上述操作,传入递归方法的size+1,直到所有节点排序完毕,得到BWT矩阵的起始列和末尾列。
5.如权利要求4所述的一种MCU的低内存占用的压缩方法,其特征在于,基于游程编码思想的重复字节压缩法包括以下步骤:
经过平整处理后的数据流为RDS-F-BB,RDS-F-BB需要压缩的字节有9位,顺序遍历RDS-F-BB中每个字节i,i连续出现n次,若n≤2,将n*i存入TCB中;若n>2,将i和11存入TCB,将n存入TLB;
创建字节数组LZCB和字节数组LZDB;定义虚拟窗口TCW,TCW在TCB自左向右滑动,TCW左边区域为TCW-L,TCW右边区域为TCW-R;TCW长度为32B,为编码区;TCW-L为已编码区;TCW-R为未编码区;利用LZSS算法,TCW在TCW-L寻找重复的结构信息并进行压缩,包括: TCW位于TCB最左端;设TCW-L与TCW存在重复结构信息长度为n,重复结构信息与TCW的距离为d,若n=0,TCW在TCB上右移一个字节,LZCB存入TCW第一个字节;若0<n<2,TCW在TCB上右移n个字节,LZCB存入TCW前n个字节;若n>2,TCW在TCB上右移n个字节,LZCB存入(12+n),LZDB存入d,TCW移出TCB时结束压缩,n表示TCW有多少个字节的重复数据,d表示TCW中的重复数据距离上一次最近出现的数据的字节数,TCW是游程编码缓冲器虚拟窗口,TCB是游程编码缓冲区,DLB是距离和长度缓存器,TLB是游程长度缓冲区。
6.如权利要求5所述的一种MCU的低内存占用的压缩方法,其特征在于,根据字典树算法对优化后的字节数组中重复的数据结构进行压缩包括以下步骤:
对TCB进行LZSS编码,将TCB每个字节和其后31个字节作为子串TCB-F,将所有TCB-F生成一颗字典树,每个节点需附带一串坐标信息,出现在此节点的字节的在TCB的下标,TCW在TCW-L寻找重复结构信息,将TCW代入字典树,寻找符合TCW的路径,判断符合TCW的路径上的节点坐标信息是否小于TCW在TCB的位移,可得到TCW在TCW-L匹配得到的最长重复结构信息,同时也得到了编码副产物LZDB、TLB;
顺序遍历LZDB和TLB每个字节i,若字节的值i小于或等于32,则将字节存入DLB,若字节的值i大于32,按照字节的值除32取整加上32和字节的值对32取余的值计算后,将得到的数值存入DLB;
基于DLB、LZCB和码表table2,得到huffman码表,根据huffman码表创建压缩文件。
7.如权利要求6所述的一种MCU的低内存占用的压缩方法,其特征在于,基于DLB、LZCB和码表table2,得到huffman码表,根据huffman码表创建压缩文件,包括以下步骤:
定义码表table2,声明结构体Huffman_Node,结构体Huffman_Node字段包含code、extra,code表示数据i在table2的编码值,extra表示还原数据i需要额外使用的字位数;分别记录table2中的code和extra,将数据i=21代入table2,得到code=7和extra=3;
Huffman_Node.code对应table2的code,Huffman_Node.extra对应table2的extra,Huffman_Node.extra为code的补充;创建Huffman_Node数组HNL,HNL长度为DLB和LZCB长度之和;创建字节数组HTMap,长度为12,HTMap每个下标对应一个code;HTMap记录每个code出现次数;创建字节数组HT,长度为13,记录huffman码表,其中HT[0]表示DLB和LZCB出现码字个数;
依次顺序遍历DLB和LZCB的每个字节i,将i代入table2得到对应的code和extra,生成一个Huffman_Node节点n并记录code和extra,将n存入HNL,HTMap对应节点数值加1;遍历结束,得到HTMap和HNL,遍历HTMap n次,n最多为12次,每次提取其内最大数字对应的下标,将下标从HT[1]开始依次存入HT中,直到HTMMap最大值为0;HT数组表示DLB和LZCB的每个字节对应code出现次数降序排序;HT[0]记录原HTMap中非0字节个数;根据HT生成huffman码表;
将huffman码表中每个字节写入压缩文件,每个字节位宽为6;顺序遍历DLB和LZCB的每个字节,记为v;在HNL找到v对应节点,记为node;在huffman码表找到对应下标,记为idx;向压缩文件写入node.code且位宽为idx、v取余node.extra且位宽为node.extra,得到压缩文件。
8.如权利要求6所述的一种MCU的低内存占用的压缩方法,其特征在于,码表table2为:
。
9.一种MCU的低内存占用的解压方法,其特征在于,包括以下步骤:
采用权利要求1-8任一所述的一种MCU的低内存占用的压缩方法进行压缩,得到压缩文件;
从所述压缩文件中获取待解压数据流;
根据huffman码表,采用字典树算法的逆运算对所述待解压数据流进行解码;得到优化后的字节数组;
采用游程编码思想的重复字节压缩法的逆运算对所述优化后的字节数组进行解压,得到预处理的数据流;
基于桶排序法和基于下标法的BWT变换的逆运算,对所述预处理的数据流进行处理,得到平整数据流;
对所述平整数据流进行平整处理的逆运算,得到原始数据流。
10.一种MCU的低内存占用的压缩和解压装置,其特征在于,包括至少一个处理器,以及与所述至少一个处理器通信连接的存储器;所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1至9中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311468413.8A CN117200805B (zh) | 2023-11-07 | 2023-11-07 | 一种mcu的低内存占用的压缩和解压方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311468413.8A CN117200805B (zh) | 2023-11-07 | 2023-11-07 | 一种mcu的低内存占用的压缩和解压方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117200805A CN117200805A (zh) | 2023-12-08 |
CN117200805B true CN117200805B (zh) | 2024-02-02 |
Family
ID=89000175
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311468413.8A Active CN117200805B (zh) | 2023-11-07 | 2023-11-07 | 一种mcu的低内存占用的压缩和解压方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117200805B (zh) |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5016009A (en) * | 1989-01-13 | 1991-05-14 | Stac, Inc. | Data compression apparatus and method |
US6075470A (en) * | 1998-02-26 | 2000-06-13 | Research In Motion Limited | Block-wise adaptive statistical data compressor |
US6597812B1 (en) * | 1999-05-28 | 2003-07-22 | Realtime Data, Llc | System and method for lossless data compression and decompression |
CN103546160A (zh) * | 2013-09-22 | 2014-01-29 | 上海交通大学 | 基于多参考序列的基因序列分级压缩方法 |
US9137336B1 (en) * | 2011-06-30 | 2015-09-15 | Emc Corporation | Data compression techniques |
CN105005464A (zh) * | 2015-07-02 | 2015-10-28 | 东南大学 | 一种Burrows Wheeler变换硬件处理装置 |
CN106685429A (zh) * | 2016-12-29 | 2017-05-17 | 广州华多网络科技有限公司 | 整数压缩方法及装置 |
CN112290953A (zh) * | 2020-10-19 | 2021-01-29 | 华南理工大学 | 多道数据流的阵列编码装置和方法、阵列解码装置和方法 |
CN115189696A (zh) * | 2022-08-01 | 2022-10-14 | 杭州电子科技大学 | 一种基于Huffman解码表的硬件压缩解压方法 |
CN116471337A (zh) * | 2023-03-30 | 2023-07-21 | 中国电子科技集团公司第十四研究所 | 一种基于bwt和lzw的报文压缩与解压缩方法及设备 |
CN116488660A (zh) * | 2023-04-20 | 2023-07-25 | 桂林电子科技大学 | 一种人体生理信号的混合数据压缩方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3913004B2 (ja) * | 2001-05-28 | 2007-05-09 | キヤノン株式会社 | データ圧縮方法及び装置及びコンピュータプログラム及び記憶媒体 |
US8108361B2 (en) * | 2008-07-31 | 2012-01-31 | Microsoft Corporation | Efficient column based data encoding for large-scale data storage |
DE102017130591B4 (de) * | 2016-12-20 | 2022-05-25 | Hyperstone Gmbh | Verfahren und Vorrichtung zur Fehlerkorrekturkodierung auf Basis einer Datenkomprimierung |
-
2023
- 2023-11-07 CN CN202311468413.8A patent/CN117200805B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5016009A (en) * | 1989-01-13 | 1991-05-14 | Stac, Inc. | Data compression apparatus and method |
US6075470A (en) * | 1998-02-26 | 2000-06-13 | Research In Motion Limited | Block-wise adaptive statistical data compressor |
US6597812B1 (en) * | 1999-05-28 | 2003-07-22 | Realtime Data, Llc | System and method for lossless data compression and decompression |
US9137336B1 (en) * | 2011-06-30 | 2015-09-15 | Emc Corporation | Data compression techniques |
CN103546160A (zh) * | 2013-09-22 | 2014-01-29 | 上海交通大学 | 基于多参考序列的基因序列分级压缩方法 |
CN105005464A (zh) * | 2015-07-02 | 2015-10-28 | 东南大学 | 一种Burrows Wheeler变换硬件处理装置 |
CN106685429A (zh) * | 2016-12-29 | 2017-05-17 | 广州华多网络科技有限公司 | 整数压缩方法及装置 |
CN112290953A (zh) * | 2020-10-19 | 2021-01-29 | 华南理工大学 | 多道数据流的阵列编码装置和方法、阵列解码装置和方法 |
CN115189696A (zh) * | 2022-08-01 | 2022-10-14 | 杭州电子科技大学 | 一种基于Huffman解码表的硬件压缩解压方法 |
CN116471337A (zh) * | 2023-03-30 | 2023-07-21 | 中国电子科技集团公司第十四研究所 | 一种基于bwt和lzw的报文压缩与解压缩方法及设备 |
CN116488660A (zh) * | 2023-04-20 | 2023-07-25 | 桂林电子科技大学 | 一种人体生理信号的混合数据压缩方法 |
Non-Patent Citations (3)
Title |
---|
Comparison of compression algorithms on vehicle communications system;Chunyan Shuai等;《2015 IEEE Advanced Information Technology, Electronic and Automation Control Conference (IAEAC)》;91-95 * |
基于BWT的数据压缩方法研究;朱启慧等;《电子世界》(第4期);5-6 * |
嵌入式平台上快速无损压缩算法的研究;裴远;《中国优秀硕士学位论文全文数据库 信息科技辑》(第3(2016年)期);I138-6728 * |
Also Published As
Publication number | Publication date |
---|---|
CN117200805A (zh) | 2023-12-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5325091A (en) | Text-compression technique using frequency-ordered array of word-number mappers | |
US6597812B1 (en) | System and method for lossless data compression and decompression | |
US8356060B2 (en) | Compression analyzer | |
EP0438955B1 (en) | Data compression method | |
US5933104A (en) | Method and system for compression and decompression using variable-sized offset and length fields | |
KR101049699B1 (ko) | 데이터의 압축방법 | |
JP2000315954A (ja) | 入力データストリームの圧縮方法とその装置 | |
JP3241788B2 (ja) | データ圧縮方式 | |
JP3231105B2 (ja) | データ符号化方式及びデータ復元方式 | |
EP0435802B1 (en) | Method of decompressing compressed data | |
EP0438954B1 (en) | Method of decoding compressed data | |
Bhadade et al. | Lossless text compression using dictionaries | |
CN117200805B (zh) | 一种mcu的低内存占用的压缩和解压方法及装置 | |
JP2536422B2 (ja) | デ―タ圧縮装置及びデ―タ復元装置 | |
JP3241787B2 (ja) | データ圧縮方式 | |
Ghuge | Map and Trie based Compression Algorithm for Data Transmission | |
JP3242795B2 (ja) | データ処理装置及びデータ処理方法 | |
JPH0628149A (ja) | 複数種類データのデータ圧縮方法 | |
Hoang et al. | Dictionary selection using partial matching | |
Stauffer et al. | Dictionary Compression on the PRAM | |
JPH05134847A (ja) | データ圧縮方法 | |
JP7305609B2 (ja) | 受信したデータを処理する装置 | |
JPH05152971A (ja) | データ圧縮・復元方法 | |
JPH06168097A (ja) | データ符号化方式及びデータ復元方式 | |
JP3100206B2 (ja) | データ圧縮方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |