一种fsn文件高效压缩方法
【技术领域】
[0001]本发明涉及一种在文件传输时通过读取字节流来进行压缩的技术,具体涉及一种对字节流二进制串进行特定算法规则的压缩方法,属于压缩技术领域。
【背景技术】
[0002]数据压缩是一项涉及通信原理和计算机科学的尖端技术,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据压缩,两者本质上没什么区别,都是映射。
[0003]—方面在进行通信的时候,有必要将待传输的数据进行压缩,以减少带宽需求;另一方面,计算机存储数据的时候,为了减少磁盘容量需求,也会将文件进行压缩,尽管现在的网络带宽越来越高,压缩已经不像90年代初那个时候那么迫切,但在很多场合下仍然需要,其中一个原因是压缩后的数据容量减小后,磁盘访问1的时间也缩短,尽管压缩和解压缩过程会消耗CPU资源,但是CPU计算资源增长得很快,但是磁盘1资源却变化得很慢,比如目前主流的SATA硬盘仍然是7200转,如果把磁盘的1压力转化到CPU上,总体上能够提升系统运行速度。
[0004]压缩可以分为无损压缩和有损压缩,有损,指的是压缩之后就无法完整还原原始信息,但是压缩率可以很高,主要应用于视频、话音等数据的压缩,因为损失了一点信息,人是很难察觉的,或者说,也没必要那么清晰照样可以看可以听;无损压缩则用于文件等等必须完整还原信息的场合,本发明自然就是一种无损压缩,在通信原理中介绍数据压缩的时候,往往是从信息论的角度出发,这里换一种思路,从最原始的思想出发,为了达到压缩的目的,需要怎么去设计算法。
【发明内容】
[0005]本发明所要解决的技术问题在于提供一种高效压缩方法,使得计算复杂度和内存消耗变得很小,从而再解压缩时也变得更为简单方便。
[0006]每个文件都由各种不同代码组成,比如01代码。这类文件只有数字O与I组合。本发明的压缩原理就是通过寻找其中的规律,简化数字的排列。比如:00000110001111111111可以简化成5个0,2个1,3个0,10个I的排列。
[0007]FSN文件是以二进制格式打开的,大部分都是连续的0,这样可以按照本发明所述的压缩方法来对其进行无损压缩,利用本发明方法压缩完后生成的新文件的二进制格式中将找不到字节值为O的内容,而且文件大小将变成原来的三分之一。
[0008]本发明提出的一种FSN文件高效压缩方法,包括以下步骤:
[0009](I)对FSN文件按字节读入并保存在一个byte数组中;
[0010](2)循环判断byte数组中每个字节值,如果该字节值为非0,首先判断前一字节值是否为0,若前一字节值为O时,则将该字节向左移动I位并保存到新的byte数组中,若前一字节值为非O时,则将该字节(无需移位)直接保存到新的byte数组中;如果该字节值为0,首先计算出连续值为O的字节个数n,然后将η以二进制串的形式向左移位并保存到新的byte数组中;
[0011](3)在新的byte数组头部加上8个字节的开始压缩标志位,在压缩标志位后填入4字节的压缩前文件内容字节数和4字节的压缩后文件内容位数,在新的byte数组尾部加上8个字节的结束标志位;
[0012](4)压缩完后生成的新文件的后缀改为wz,以区分压缩前的FSN文件。
[0013]本发明方法是通过固定位长算法演化而来。固定位长算法是把文本用需要的最少的位来进行压缩编码。比如八个十六进制数:1,2,3,4,5,6,7,8。转换为二进制为:00000001,00000010,00000011,00000100,00000101,00000110,00000111,00001000。每个数只用到了低4位,而高4位没有用到(全为O),因此对低4位进行压缩编码后得到:0001,0010,0011,0100,0101,0110,0111,1000。然后补充为字节得到:00010010,00110100,01010110,01111000ο所以原来的八个十六进制数缩短了一半,得到4个十六进制数:12,34,56,78。
[0014]本发明是在此算法基础之上又做了进一步的改进,使得压缩比更高,压缩效率更快。当连续值为O的字节个数η小于等于7时,输出right (bin (η), 4)的二进制串放入到新的byte数组中;当连续值为O的字节个数η大于7并且可以被7整除时,输出right (bin (7),4)* (n mod 7)的二进制串放入到新的byte数组中;当连续值为O的字节个数 η 大于 7 并且不可以被 7 整除时,输出 right (bin(7),4)*(n mod 7)+right (bin(n% 7))的二进制串放入到新的byte数组中。经过此种算法可以更大限度的压缩无用字节,以保证压缩完后的文件内容都是有效数据,减少存储空间和传输流量。
[0015]进一步地,压缩后文件内容字节数+16 = wz文件字节数>16 ;压缩后文件内容位数+7〉=压缩后文件内容字节数*8> =压缩后文件内容位数;压缩后文件内容二进制位串中连续O长度〈=10。
[0016]本发明的有益效果:
[0017]1.利用了传统的固定位长算法,编码相当容易理解,有利于解析。
[0018]2.由于是按位编码操作,算法容易重构,支持各种编程语言(JAVA,C,C++,C#等)。
[0019]3.本方法方法大大减轻了设备端的处理压力,也在网络传输过程中降低了传输流量,大大提升了文件上传速度和文件上传量,降低带宽要求和减少网络压力。
【附图说明】
[0020]图1为以二进制格式打开的压缩前的FSN文件截图;
[0021]图2为以二进制格式打开的压缩后的wz文件截图;
[0022]图3为具体的二进制压缩数据流位移图;
[0023]图4为二叉码树图;
[0024]图5为FSN文件压缩流程图。
【具体实施方式】
[0025]本发明为了解决传统技术方案存在的弊端,通过以下实施例进一步阐述本发明所述的一种FSN文件高效压缩方法,以下对【具体实施方式】进行详细描述,但不作为对本发明的限定。
[0026]本发明的实现是基于固定位长算法基础之上又做了进一步的改进,通过设备生成的FSN文件以字节流的方式经过特定的无损压缩算法,而演化出的一套独有的高效率的压缩方法。
[0027]如图1所示,通过支持生成FSN文件的设备先生成出一个FSN文件,该文件以二进制格式打开,如图1所示,该文件内容包括:设备编号,点钞张数,点钞时间,币种,币值,冠字号码,冠字号图片等信息;该文件大小固定(文件字节位数固定);根据图1可以清楚的发现有很多连续的O字节内容,这些无用的字节都是可以被压缩掉的;其他非O字节内容可以通过移位的方式进行重新排列,从而得到一个新的字节流。
[0028]如图2所示,就是图1文件通过本压缩方法压缩过后生成的二进制字节流,从图中可以发现之前的O字节内容已经被舍去,之前的非O字节内容也已经重新排列组合成新的字节流,文件总大小也变成了之前的三分之一;需要注意的是压缩完后的字节流前4个字节存放的是压缩前文件内容字节数,紧接着4个字节存放的是压缩后文件内容位数;
[0029]如图3所示,是本发明的核心压缩位移图,通过此图可以发现本发明的压缩方法的核心就是通过压缩连续的O字节内容来进行字节流的重新排列组合,以达到最终的压缩效果。
[0030]如图4所示,是以二叉树的方式对图3做的一个补充说明。遇O字节时舍去并记录O的个数向前补位,遇非O字节时计算当前压缩位置并向前补位。
[0031]如图5所示,是本发明一种FSN文件高效压缩方法的具体流程图,包括以下步骤:
[0032](I)对FSN文件按字节读入并保存在一个byte数组中;
[0033](2)循环判断byte数组中每个字节值,如果该字节值为非0,首先判断前一字节值是否为0,若前一字节值为O时,则将该字节向左移动I位并保存到新的byte数组中,若前一字节值为非O时,则将该字节(无需移位)直接保存到新的byte数组中;如果该字节值为0,首先计算出连续值为O的字节个数n,然后将η以二进制串的形式向左移位并保存到新的byte数组中,具体为:当连续值为O的字节个数η小于等于7时,则输出right (bin (η),4)的二进制串保存到新的byte数组中;当连续值为O的字节个数η大于7并且可以被7整除时,则输出right (bin (7),4)* (n mod 7)的二进制串保存到新的byte数组中;当连续值为O的字节个数η大于7并且不可以被7整除时,则输出right (bin(7),4)*(n mod7)+right (bin(n% 7))的二进制串保存到新的byte数组中;
[0034](3)在新的byte数组头部加上8个字节的开始压缩标志位,在压缩标志位后填入4字节的压缩前文件内容字节数和4字节的压缩后文件内容位数,在新的byte数组尾部加上8个字节的结束标志位;
[0035](4)压缩完后生成的新文件的后缀改为wz,以区分压缩前的FSN文件。压缩完后的新文件大小是原文件大小的三分之一。
【主权项】
1.一种FSN文件高效压缩方法,其特征在于,该方法包括以下步骤: (1)对FSN文件按字节读入并保存在一个byte数组中; (2)循环判断byte数组中每个字节值,如果该字节值为非0,首先判断前一字节值是否为0,若前一字节值为0时,则将该字节向左移动1位并保存到新的byte数组中,若前一字节值为非0时,则将该字节直接保存到新的byte数组中;如果该字节值为0,首先计算出连续值为0的字节个数n,然后将η以二进制串的形式向左移位并保存到新的byte数组中; (3)在新的byte数组头部加上8个字节的开始压缩标志位,在压缩标志位后填入4字节的压缩前文件内容字节数和4字节的压缩后文件内容位数,在新的byte数组尾部加上8个字节的结束标志位; (4)压缩完后生成的新文件的后缀改为wz,以区分压缩前的FSN文件。2.根据权利要求1所述的一种FSN文件高效压缩方法,其特征在于,所述步骤2进一步包括:当连续值为0的字节个数η小于等于7时,则输出right (bin (η), 4)的二进制串保存到新的byte数组中;当连续值为0的字节个数η大于7并且可以被7整除时,则输出right (bin (7),4)* (n mod 7)的二进制串保存到新的byte数组中;当连续值为0的字节个数η大于7并且不可以被7整除时,则输出right (bin (7), 4)* (n mod 7)+right (bin (n%7))的二进制串保存到新的byte数组中。3.根据权利要求1所述的一种FSN文件高效压缩方法,其特征在于,所述步骤3中,压缩后文件内容字节数+16 = wz文件字节数>16 ;压缩后文件内容位数+7> =压缩后文件内容字节数*8> =压缩后文件内容位数;压缩后文件内容二进制位串中连续0长度〈=10。
【专利摘要】本发明公开了一种FSN文件高效压缩方法,通过设备生成的FSN文件以字节流的方式经过特定的无损压缩处理而得到的一种高效的压缩方法。采用本发明方法,可以使设备生成的FSN文件压缩成一定比例后再通过FTP进行上传。这种压缩方法大大减轻了设备端的处理压力,在网络传输过程中降低了传输流量,大大提升了文件上传速度和文件上传量,降低带宽要求和减少网络压力。
【IPC分类】H03M7/30
【公开号】CN105337617
【申请号】CN201510908590
【发明人】魏伟, 陈祥献, 虞华锋, 商茎正, 陈小勇, 陈金栋, 冯国平, 程露露
【申请人】浙江维融电子科技股份有限公司
【公开日】2016年2月17日
【申请日】2015年12月9日