CN111600610B - 一种变长整数的通用编码方法、系统及电子设备 - Google Patents
一种变长整数的通用编码方法、系统及电子设备 Download PDFInfo
- Publication number
- CN111600610B CN111600610B CN202010454887.7A CN202010454887A CN111600610B CN 111600610 B CN111600610 B CN 111600610B CN 202010454887 A CN202010454887 A CN 202010454887A CN 111600610 B CN111600610 B CN 111600610B
- Authority
- CN
- China
- Prior art keywords
- byte
- binary
- encoded
- bytes
- integer
- 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
Images
Classifications
-
- H—ELECTRICITY
- H03—ELECTRONIC CIRCUITRY
- H03M—CODING; DECODING; CODE CONVERSION IN GENERAL
- H03M7/00—Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
- H03M7/30—Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
- H03M7/40—Conversion to or from variable length codes, e.g. Shannon-Fano code, Huffman code, Morse code
- H03M7/4006—Conversion to or from arithmetic code
- H03M7/4012—Binary arithmetic codes
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明涉及一种变长整数的通用编码方法、系统及电子设备,根据任意整数得到相应的无符号整数A,再通过第一种编码策略对无符号整数A进行编码时,删除第一编码中间字节中只包括0的字节,将无符号整数A的二进制字节的数据长度进行有效压缩,生成了数据长度较小的第一编码字节,也就是将任意整数编码为数据长度较小的第一编码字节,可以有效降低整数在二进制流中占用的体积大小,从而提高二进制流即数据的I/O的传输效率。
Description
技术领域
本发明涉及数字编码技术领域,尤其涉及一种变长整数的通用编码方法、系统及电子设备。
背景技术
目前,计算机的运行速度已经非常快,其CPU和内存的配置已经不再主要是制约应用软件、应用程序等运行效率的瓶颈,而数据的I/O(输入/输出(Input/Output))的传输效率在很大程度上决定了应用软件、应用程序等的执行速度和/或网络传输速度。
因此,如何提高数据的I/O的传输效率是业内亟待解决的技术问题。
发明内容
本发明所要解决的技术问题是针对现有技术的不足,提供一种变长整数的通用编码方法、系统及电子设备。
本发明的一种变长整数的通用编码方法的技术方案如下:
S1、根据任意整数得到相应的无符号整数A,并将所述无符号整数A生成数据长度为N个字节的二进制字节,其中,N为正整数;
S2、当N=2且所述二进制字节的首字节不大于0x3F时、当N=4且所述二进制字节的首字节不大于0x1F时和/或当N=8且所述二进制字节的首字节不大于0x0F时,将所述二进制字节按照第一种编码策略进行编码,形成相应的第一编码字节;
其中,所述将所述二进制字节按照第一种编码策略进行编码,形成相应的第一编码字节,包括:
S20、当所述二进制字节的后i位均为0且i≥P时,将所述二进制字节右移P位,得到第一编码中间字节,其中,i>0且i为整数,P为正整数;
S21、删除所述第一编码中间字节中只包括0的字节,得到第二编码中间字节;
S22、当所述第二编码中间字节的首字节的前1+j位中不包括1时,且当2(7-j)+8W≥A时,将所述第二编码中间字节的首字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,然后得到所述第一编码字节,其中j为正整数,其中W表示所述第二编码中间字节的字节个数。
本发明的一种变长整数的通用编码方法的有益效果如下:
根据任意整数得到相应的无符号整数A,再通过第一种编码策略对无符号整数A进行编码时,删除第一编码中间字节中只包括0的字节,将无符号整数A的二进制字节的数据长度进行有效压缩,生成了数据长度较小的第一编码字节,也就是将任意整数编码为数据长度较小的第一编码字节,可以有效降低整数在二进制流中占用的体积大小,从而提高二进制流即数据的I/O的传输效率。
在上述方案的基础上,本发明的一种变长整数的通用编码方法还可以做如下改进。
进一步,所述S20中还包括:
S200、当i<P时,不对所述二进制字节进行右移,并在所述二进制字节的首字节前补充第一零字节:00000000,得到所述第一编码中间字节。
采用上述进一步方案的有益效果:防止对二进制字节进行右移后使整数发生改变。
进一步,所述S22中还包括:
S220、当所述第二编码中间字节的首字节的前1+j位中包括1时和/或当2(7-j)+8W<A时,在所述第二编码中间字节的首字节前补充至少1个第二零字节:00000000,再将首个所述第二零字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,得到所述第一编码字节。
采用上述进一步方案的有益效果是:防止直接对第二编码中间字节的首字节的前1+j位直接进行替换导致整数发生改变。
进一步,还包括:
当N=2时,设置P=6,j=1,所述第二编码中间字节的首字节的前2位为0X,X为0或1,其中,当X为0时,表示所述第一编码字节的数据长度为1个字节,X为1时,表示所述第一编码字节的数据长度为2个字节;
当N=4时,设置P=5,j=2,所述第二编码中间字节的首字节的前3位为0XX,其中,当XX为00时,表示所述第一编码字节的数据长度为1个字节,依此类推,当XX为11时,表示所述第一编码字节的数据长度为3个字节;
当N=8时,设置P=4,j=3,所述第二编码中间字节的首字节的前4位为0XXX,其中,当XXX为000时,表示所述第一编码字节的数据长度为1个字节,依此类推,当XXX为111时,表示所述第一编码字节的数据长度为8个字节。
进一步,还包括:
S2000、当N=2且所述二进制字节的首字节大于0x3F时、当N=4且所述二进制字节的首字节大于0x1F时和/或当N=8且所述二进制字节的首字节大于0x0F时,将所述二进制字节按照第二种编码策略进行编码,形成相应的第二编码字节。
进一步,所述将所述二进制字节按照第二种编码策略进行编码,形成相应的第二编码字节,包括:
在所述二进制字节的首字节前补充前导字节:10000000,将所述二进制字节紧随在所述前导字节之后,生成所述第二编码字节。
进一步,还包括:当需要所述二进制字节时,利用与所述第一种编码策略相对应的第一种解码策略对所述第一编码字节进行解码,得到所述二进制字节。
进一步,还包括:当需要所述二进制字节时,利用与所述第二种编码策略相对应的第二种解码策略对所述第二编码字节进行解码,得到所述二进制字节。
本发明的一种变长整数的通用编码系统的技术方案如下:
包括生成模块和第一种编码策略模块;
所述生成模块用于根据任意整数得到相应的无符号整数A,并将所述无符号整数A生成数据长度为N个字节的二进制字节,其中,N为正整数;
所述第一种编码策略模块用于当N=2且所述二进制字节的首字节不大于0x3F时、当N=4且所述二进制字节的首字节不大于0x1F时和/或当N=8且所述二进制字节的首字节不大于0x0F时,将所述二进制字节按照第一种编码策略进行编码,形成相应的第一编码字节;
所述第一种编码策略模块具体用于:
当所述二进制字节的后i位均为0且i≥P时,将所述二进制字节右移P位,得到第一编码中间字节,其中,i>0且i为整数,P均为正整数;
删除所述第一编码中间字节中只包括0的字节,得到第二编码中间字节;
当所述第二编码中间字节的首字节的前1+j位中不包括1时,且当2(7-j)+8W≥A时,将所述第二编码中间字节的首字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,然后得到所述第一编码字节,其中j为正整数,其中W表示所述第二编码中间字节的字节个数。
本发明的一种变长整数的通用编码系统的有益效果如下:
根据任意整数得到相应的无符号整数A,再通过第一种编码策略对无符号整数A进行编码时,删除第一编码中间字节中只包括0的字节,将无符号整数A的二进制字节的数据长度进行有效压缩,生成了数据长度较小的第一编码字节,也就是将任意整数编码为数据长度较小的第一编码字节,可以有效降低整数在二进制流中占用的体积大小,从而提高二进制流即数据的I/O的传输效率。
在上述方案的基础上,本发明的一种变长整数的通用编码系统还可以做如下改进。
进一步,所述第一种编码策略模块还用于:
若i<P时,不对所述二进制字节进行右移,并在所述二进制字节的首字节前补充第一零字节:00000000,得到所述第一编码中间字节。
采用上述进一步方案的有益效果:防止对二进制字节进行右移后使整数发生改变。
进一步,所述第一种编码策略模块还用于:当所述第二编码中间字节的首字节的前1+j位中包括1时和/或当2(7-j)+8W<A时,在所述第二编码中间字节的首字节前补充至少一个第二零字节:00000000,再将首个所述第二零字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,得到所述第一编码字节。
采用上述进一步方案的有益效果是:防止直接对第二编码中间字节的首字节的前1+j位直接进行替换导致整数发生改变。
进一步,所述第一种编码策略模块还用于:
当N=2时,设置P=6,j=1,所述第二编码中间字节的首字节的前2位为0X,X为0或1,其中,当X为0时,表示所述第一编码字节的数据长度为1个字节,X为1时,表示所述第一编码字节的数据长度为2个字节;
当N=4时,设置P=5,j=2,所述第二编码中间字节的首字节的前3位为0XX,其中,当XX为00时,表示所述第一编码字节的数据长度为1个字节,依此类推,当XX为11时,表示所述第一编码字节的数据长度为3个字节;
当N=8时,设置P=4,j=3,所述第二编码中间字节的首字节的前4位为0XXX,其中,当XXX为000时,表示所述第一编码字节的数据长度为1个字节,依此类推,当XXX为111时,表示所述第一编码字节的数据长度为8个字节。
进一步,还包括第二种编码策略模块,所述第二种编码策略模块用于:所述阈值判断模块判定当N=2且所述二进制字节的首字节大于0x3F时、当N=4且所述二进制字节的首字节大于0x1F时和/或当N=8且所述二进制字节的首字节大于0x0F时,所述第二种编码策略模块将所述二进制字节按照第二种编码策略进行编码,形成相应的第二编码字节。
进一步,所述第二种编码策略模块具体用于:在所述二进制字节的首字节前补充前导字节:10000000,将所述二进制字节紧随在所述前导字节之后,生成所述第二编码字节。
进一步,还包括第一种解码策略模块,所述第一种解码策略模块用于:当需要所述二进制字节时,利用与所述第一种编码策略相对应的第一种解码策略对所述第一编码字节进行解码,得到所述二进制字节。
进一步,还包括第二种解码策略模块,所述第二种解码策略模块用于:当需要所述二进制字节时,利用与所述第二种编码策略相对应的第二种解码策略对所述第二编码字节进行解码,得到所述二进制字节。
本发明的一种电子设备的技术方案为:包括存储器、处理器及存储在所述存储器上并在所述处理器上运行的程序,所述处理器执行所述程序时实现上述任一项所述的一种变长整数的通用编码方法的步骤。
本发明的一种电子设备的有益效果是:根据任意整数得到相应的无符号整数,再通过第一种编码策略对无符号整数进行编码时,删除第一编码中间字节中只包括0的字节,将无符号整数的二进制字节的数据长度进行有效压缩,生成了数据长度较小的第一编码字节,也就是将任意整数生成了数据长度较小的第一编码字节,可以有效降低整数在二进制流中占用的体积大小,从而提高二进制流即数据的I/O的传输效率。
附图说明
图1为本发明实施例的一种变长整数的通用编码方法的流程示意图;
图2为本发明实施例的一种变长整数的通用编码方法中的第一种编码策略的流程示意图;
图3为本发明实施例的一种变长整数的通用编码系统的结构示意图。
具体实施方式
本实施例的一种变长整数的通用编码方法,如图1所示,包括如下步骤:
S1、根据任意整数得到相应的无符号整数A,并将无符号整数A生成数据长度为N个字节的二进制字节,其中,N为正整数;
S2、当N=2且所述二进制字节的首字节不大于0x3F时、当N=4且所述二进制字节的首字节不大于0x1F时和/或当N=8且所述二进制字节的首字节不大于0x0F时,将所述二进制字节按照第一种编码策略进行编码,形成相应的第一编码字节;
其中,如图2所示,所述将所述二进制字节按照第一种编码策略进行编码,形成相应的第一编码字节,包括:
S20、当所述二进制字节的后i位均为0且i≥P时,将所述二进制字节右移P位,得到第一编码中间字节,其中,i>0且i为整数,P为正整数;
S21、删除所述第一编码中间字节中只包括0的字节,得到第二编码中间字节;
S22、当所述第二编码中间字节的首字节的前1+j位中不包括1时,且当2(7-j)+8W≥A时,将所述第二编码中间字节的首字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,然后得到所述第一编码字节,其中j为正整数,其中W表示所述第二编码中间字节的字节个数。
根据任意整数得到相应的无符号整数A,再通过第一种编码策略对无符号整数A进行编码时,删除第一编码中间字节中只包括0的字节,将无符号整数A的二进制字节的数据长度进行有效压缩,生成了数据长度较小的第一编码字节,也就是将任意整数编码为数据长度较小的第一编码字节,可以有效降低整数在二进制流中占用的体积大小,从而提高二进制流即数据的I/O的传输效率,具体地:
当前计算机的设计语言多种多样,但都有整数的概念,而且,根据整数的数据长度来进行划分来看,可包含单字节、二字节、四字节和八字节等,以C/C++语言为例,具体地:
int8_t或uint8_t代表一个字节即单字节,有8位数据;
int16_t或uint16_t代表两个字节即二字节,有16位数据;
int32_t或uint32_t代表四个字节即四字节,有32位数据
int64_t或uint64_t代表八个字节即八字节,有64位数据;
其中带字母“u”开头的类型代表无符号整数,不带“u”开头的代表带符号整数,对于符号整数来说,如果首字节的第一个二进制位是1表示负整数,0表示正整数,对于无符号整数来说没有这种概念,都是数据部分,因为带符号整数和无符号整数之间是可以相互转换的,不同的编程语言提供了不同的互转规则,此处不再过多阐述;以无符号整数A=1为例,那么:
将无符号整数1转为数据长度为两字节的二进制字节为:00000000 00000001;
将无符号整数1转为数据长度为四字节的二进制字节为:00000000 0000000000000000 00000001;
将无符号整数1转为数据长度为八字节的二进制字节为:00000000 0000000000000000 00000000 00000000 00000000 00000000 00000001;
从中可以看出,对于无符号整数1来说,数据长度的字节个数越多,所占用的存储空间就越大,传输或存储时就越慢,因此本申请的一种变长整数的通用编码方法通过压缩0占用的位,就可以减少传输或存储占用的字节个数,从而提高二进制流即数据的I/O的传输效率,而且,通过编程语言的左移来操作整数的二进制字节,编码效率高,其中可以理解的是:各二进制字节中的空格是便于用户阅读而设置,并非真实存在。
另外,在有些编程语言如java语言中,没有无符号整数的概念,但是可以采用变通的方法把有符号数变成无符号整数,可以通过Integer.toUnsignedLong()函数把带符号的四字节整数value,变长无符号的八字节整数uiValue,其代码为:
long uiValue=Integer.toUnsignedLong(value);
其中,通过设置固定位0,以便于下文中的第一种解码策略对第一编码字节进行识别。
其中,对于数据长度为一个字节即单字节的无符号整数来说,因为计算机传输和存储的最小单位是字节,所以不需要进一步的压缩编码,按照原样存储就行。
较优地,在上述技术方案中,S20中还包括:
S200、当i<P时,不对二进制字节进行右移,并在二进制字节的首字节前补充第一零字节:00000000,得到第一编码中间字节,防止对二进制字节进行右移后使整数发生改变。
较优地,在上述技术方案中,S22中还包括:
S220、当第二编码中间字节的首字节的前1+j位中包括1时,和/或当2(7-j)+8W<A时,在第二编码中间字节的首字节前补充至少1个第二零字节:00000000,再将首个第二零字节的首位设置为固定位:0,将紧随固定位的后j位设置为表示第一编码字节的数据长度的二进制数,得到第一编码字节。
防止直接对第二编码中间字节的首字节的前1+j位直接进行替换导致整数发生改变。
较优地,在上述技术方案中,还包括:
当N=2时,设置P=6,j=1,第二编码中间字节的首字节的前2位为0X,X为0或1,其中,当X为0时,表示第一编码字节的数据长度为1个字节,X为1时,表示第一编码字节的数据长度为2个字节;
当N=4时,设置P=5,j=2,第二编码中间字节的首字节的前3位为0XX,其中,当XX为00时,表示第一编码字节的数据长度为1个字节,依此类推,当XX为11时,表示第一编码字节的数据长度为3个字节;
当N=8时,设置P=4,j=3,第二编码中间字节的首字节的前4位为0XXX,其中,当XXX为000时,表示第一编码字节的数据长度为1个字节,依此类推,当XXX为111时,表示第一编码字节的数据长度为8个字节。
较优地,在上述技术方案中,还包括如下步骤:
S2000、当N=2且二进制字节的首字节大于0x3F时、当N=4且二进制字节的首字节大于0x1F时和/或当N=8且二进制字节的首字节大于0x0F时,将二进制字节按照第二种编码策略进行编码,形成相应的第二编码字节。
较优地,在上述技术方案中,所述将所述二进制字节按照第二种编码策略进行编码,形成相应的第二编码字节,包括:
在所述二进制字节的首字节前补充前导字节:10000000,将所述二进制字节紧随在所述前导字节之后,生成所述第二编码字节。
较优地,在上述技术方案中,还包括:
当需要所述二进制字节时,利用与所述第二种编码策略相对应的第二种解码策略对所述第二编码字节进行解码,得到所述二进制字节。
还以无符号整数1即A=1为例对本申请的一种变长整数的通用编码方法进行详细阐述,具体地:
1)将无符号整数1转为数据长度为四字节的二进制字节为:00000000 0000000000000000 00000001;
2)其中,二进制字节的首字节为“00000000”,转为十六进制后为0x00,且0x00小于0x3F,因此用第一种编码策略,其中,当N=4时,P=5,j=2;
3)二进制字节的最后一位为“1”,即i=0,由于0=i<P=5,所以不符合S20,符合S200,此时,不对二进制字节进行右移,并在二进制字节的首字节前补充第一零字节:00000000,得到第一编码中间字节为00000000 00000000 00000000 00000000 00000001;
4)删除第一编码中间字节中只包括0的字节,得到第二编码中间字节为:00000001,其字节个数W=1;
5)第二编码中间字节的首字节的前1+j位即前3位为“000”,不包括0,将第二编码中间字节的首字节的首位设置为固定位:0,将紧随固定位的后2位设置为表示第一编码字节的数据长度的二进制数,且根据当XX为00时,表示第一编码字节的数据长度为1个字节,且带入2(7-j)+8W=63>A=1,因此第一编码字节的字节个数为1个,因此得到第一编码字节为00000001;
可以看到,对于数据常数为四字节的整数“1”来说,存储空间从编码前的4个字节,变成了编码后的1个字节,存储空间减至四分之一;
6)当需要二进制字节时,利用与第一种编码策略相对应的第一种解码策略对第一编码字节进行解码,且解码时,由于第一编码字节:00000001的首位即固定位为“0”,因此,由此判断出用第一种解码策略对其进行解码,具体地:
①第一种解码策略读取紧随固定位的后2位为“00”,则只读取一个字节即第一编码字节:00000001;
②第一种解码策略删除第一编码字节的前3位,并对其进行补零后恢复至二进制字节为:00000000 00000000 00000000 00000001;
在另外一个实施例中,用无符号整数256即A=256来对本申请的一种变长整数的通用编码方法进行详细阐述:
1)将无符号整数256转为数据长度为二字节的二进制字节为:0000000100000000;
2)其二进制字节的首字节为“00000001”,转为十六进制后为0x01,且0x01小于0x3F,因此采用第一种编码策略,其中,当N=2时,P=6,j=1;
3)二进制字节的后8位为“00000000”,即i=8,由于8=i>P=6,所以不符合S200,符合S20,此时,对二进制字节进行右移6位得到第一编码中间字节为:00000000 00000100;
4)删除第一编码中间字节中只包括0的字节,得到第二编码中间字节为:00000100,其字节个数W=1;
5)假如转成的第一编码字节的数据常数为1个字节时,则为“00DDDDDD”,其中,D为1或0,由此可以看出,第一编码字节的数据长度为1个字节时,最大存储的值为11111即D全部为1,将其转为十进制后为63小于256,用数学式表示为:2(8-j-1)+8W=2(7-j)+8W=63<256,因此,不能用1个字节来存储上述二进制字节;
若在第二编码中间字节的首字节前补充1个第二零字节:00000000,则为“01DDDDDD DDDDDDDD”,由此可以看出,第一编码字节的数据长度为2个字节时,最大存储的值为“111111 11111111”即D全部为1,将其转为十进制后为9593,大于256,用数学式表示为:2(8-j-1)+8(W+b)=2(7-j)+8(W+b)=9593>256,因此用2个字节来存储上述二进制字节,其中,b表示补充第二零字节的个数,且以此类推,归纳出2(8-j-1)+8W与无符号整数A之间的关系,当满足2(7-j)+8(W+b)≥A,取b的最小值,即为补充第二零字节的个数;
再将首个第二零字节的首位设置为固定位:0,将紧随固定位的后j=1位设置为表示第一编码字节的数据长度的二进制数,由此得到第一编码字节为01000000 00000100;
6)当需要二进制字节时,利用与第一种编码策略相对应的第一种解码策略对第一编码字节进行解码,且解码时,由于第一编码字节的首位即固定位为“0”,因此,由此判断出用第一种解码策略对其进行解码,具体地:
①第一种解码策略读取紧随固定位的后1位为“1”,则读取2个字节即第一编码字节:01000000 00000100;
②第一种解码策略删除第一编码字节的前2位,并对其进行左移操作并补零后恢复至二进制字节为:00000001 00000000;
在另外一个实施例中,用无符号整数256即A=256来对本申请的一种变长整数的通用编码方法进行详细阐述:
1)将无符号整数256转为数据长度为四字节的二进制字节为:00000000000000000000000100000000;
2)其二进制字节的首字节为“00000000”,转为十六进制后为0x00,且0x01小于0x1F,因此用第一种编码策略,其中,当N=4时,P=5,j=2;
3)二进制字节的后8位为“00000000”,即i=8,由于8=i>P=5,所以不符合S200,符合S20,此时,对二进制字节进行右移5位得到第一编码中间字节为:00000000 0000000000000000 00001000;
4)删除第一编码中间字节中只包括0的字节,得到第二编码中间字节为:00001000,其字节个数W=1;
5)由于2(8-j-1)+8W=2(7-j)+8W=63<256,则补充第二零字节,由于当b=1时,2(8 -j-1)+8(W+b)=2(7-j)+8(W+b)=9593>256,则补充1个第二零字节;
再将首个第二零字节的首位设置为固定位:0,将紧随固定位的后j=2位设置为表示第一编码字节的数据长度的二进制数,由此得到第一编码字节为00100000 00001000;
6)当需要二进制字节时,利用与第一种编码策略相对应的第一种解码策略对第一编码字节进行解码,且解码时,由于第一编码字节:00100000的首位即固定位为“0”,因此,由此判断出用第一种解码策略对其进行解码,具体地:
①第一种解码策略读取紧随固定位的后2位为“01”,则读取2个字节即第一编码字节:00100000 00001000;
②第一种解码策略删除第一编码字节的前3位,并对其进行左移操作并补零后恢复至二进制字节为:00000000 00000000 00000001 00000000。
在另外一个实施例中,用无符号整数256即A=256来对本申请的一种变长整数的通用编码方法进行详细阐述:
1)将无符号整数256转为数据长度为八字节的二进制字节为:00000000 0000000000000000 00000000 00000000 00000000 00000001 00000000;
2)其二进制字节的首字节为“00000000”,转为十六进制后为0x00,且0x01小于0x0F,因此用第一种编码策略,其中,当N=8时,P=4,j=3;
3)二进制字节的后8位为“00000000”,即i=8,由于8=i>P=4,所以不符合S200,符合S20,此时,对二进制字节进行右移4位得到第一编码中间字节为:00000000 0000000000000000 00000000 00000000 00000000 00000000 00001000;
4)删除第一编码中间字节中只包括0的字节,得到第二编码中间字节为:00001000,其字节个数W=1;
5)由于2(8-j-1)+8W=2(7-j)+8W=63<256,则补充第二零字节,由于当b=1时,2(8 -j-1)+8(W+b)=2(7-j)+8(W+b)=9593>256,则补充1个第二零字节;
再将首个第二零字节的首位设置为固定位:0,将紧随固定位的后j=2位设置为表示第一编码字节的数据长度的二进制数,由此得到第一编码字节为00010000 00001000;
6)当需要二进制字节时,利用与第一种编码策略相对应的第一种解码策略对第一编码字节进行解码,且解码时,由于第一编码字节的首位即固定位为“0”,因此,由此判断出用第一种解码策略对其进行解码,具体地:
①第一种解码策略读取紧随固定位的后3位为“001”,则读取2个字节即第一编码字节:00010000 00001000;
②第一种解码策略删除第一编码字节的前4位,并对其进行左移操作并补零后恢复至二进制字节为:00000000 00000000 00000000 00000000 00000000 0000000000000001 00000000。
当将无符号整数A转为数据长度为2个字节的二进制字节时,根据N=2和相应的二进制字节的首字节大于0x3F之间的关系,可得到当无符号整数A转为十六进制的数值小于0x3F FF时,采用第一种编码策略,否则采用第二种编码策略;
当将无符号整数A转为数据长度为4个字节的二进制字节时,根据N=4和相应的二进制字节的首字节大于0x1F之间的关系,可得到当无符号整数A转为十六进制的数值小于0x1FFFFFFF时,采用第一种编码策略,否则采用第二种编码策略。
当将无符号整数A转为数据长度为8个字节的二进制字节时,根据N=8和相应的二进制字节的首字节大于0x0F之间的关系,可得到当无符号整数A转为十六进制的数值小于0X0FFFFFFFFFFFFFFFL时,采用第一种编码策略,否则采用第二种编码策略;
在另外一个实施例中,对第二种编码策略进行详细阐述,具体地:
1)无符号整数A=16384时,转为数据长度为二字节的二进制字节为:0100000000000000;
2)由于二进制字节的首字节01000000转为十六进制为0x40,大于0x3F,采用第二种编码策略;
3)在二进制字节的首字节前补充前导字节:10000000,将二进制字节紧随在前导字节之后,得到第二编码字节为10000000 01000000 00000000;
4)当需要二进制字节时,利用与第二种编码策略相对应的第二种解码策略对第二编码字节进行解码,且解码时,由于第二编码字节首位即固定位为“1”,因此,由此判断出用第二种解码策略对其进行解码,第二种解码策略具体为:读取第二编码字节,并上删除第二编码字节中的前导字节,保留紧随在前导字节之后的字节:01000000 00000000,由此得到二进制字节。
在另外一个实施例中,对第二种编码策略进行详细阐述,具体地:
1)无符号整数A=805306367时,转为数据长度为二字节的二进制字节为:01011111 11111111 1111111 11111111;
2)由于二进制字节的首字节01011111转为十六进制为0x5F,大于0x1F,采用第二种编码策略;
3)在二进制字节的首字节前补充前导字节:10000000,将二进制字节紧随在前导字节之后,得到第二编码字节为10000000 01011111 11111111 1111111 11111111;
4)当需要二进制字节时,利用与第二种编码策略相对应的第二种解码策略对第二编码字节进行解码,且解码时,由于第二编码字节首位即固定位为“1”,因此,由此判断出用第二种解码策略对其进行解码,第二种解码策略具体为:读取第二编码字节,并上删除第二编码字节中的前导字节,保留紧随在前导字节之后的字节:01011111 11111111 111111111111111,由此得到二进制字节。
在另外一个实施例中,对第二种编码策略进行详细阐述,具体地:
1)无符号整数A=2305843009213693951时,转为数据长度为二字节的二进制字节为:00011111 11111111 11111111 11111111 11111111 11111111 11111111 11111111;
2)由于二进制字节的首字节01011111转为十六进制为0x1F,大于0x0F,采用第二种编码策略;
3)在二进制字节的首字节前补充前导字节:10000000,将二进制字节紧随在前导字节之后,得到第二编码字节为10000000 00011111 11111111 11111111 1111111111111111 11111111 11111111 11111111;
4)当需要二进制字节时,利用与第二种编码策略相对应的第二种解码策略对第二编码字节进行解码,且解码时,由于第二编码字节首位即固定位为“1”,因此,由此判断出用第二种解码策略对其进行解码,第二种解码策略具体为:读取第二编码字节,并上删除第二编码字节中的前导字节,保留紧随在前导字节之后的字节:00011111 11111111 1111111111111111 11111111 11111111 11111111 11111111,由此得到二进制字节。
其中,在编程时,可在类中定义encode、decode和getLength三个函数,其中encode函数用于采用第一编码策略或第二编码策略对二进制字节进行编码,decode函数用于采用第一解码策略或第二解码策略分别对第一编码字节或第二编码字节进行解码,getLength函数用于用于读取首字节,来第一编码字节的实际数据长度即字节个数。
如图3所示,本发明实施例的一种变长整数的通用编码系统200,包括生成模块210和第一种编码策略模块220;
所述生成模块用于根据任意整数得到相应的无符号整数A,并将所述无符号整数A生成数据长度为N个字节的二进制字节,其中,N为正整数;
所述第一种编码策略模块用于当N=2且所述二进制字节的首字节不大于0x3F时、当N=4且所述二进制字节的首字节不大于0x1F时和/或当N=8且所述二进制字节的首字节不大于0x0F时,将所述二进制字节按照第一种编码策略进行编码,形成相应的第一编码字节;
所述第一种编码策略模块220具体用于:
当所述二进制字节的后i位均为0且i≥P时,将所述二进制字节右移P位,得到第一编码中间字节,其中,i>0且i为整数,P均为正整数;
删除所述第一编码中间字节中只包括0的字节,得到第二编码中间字节;
当所述第二编码中间字节的首字节的前1+j位中不包括1时,且当2(7-j)+8W≥A时,将所述第二编码中间字节的首字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,然后得到所述第一编码字节,其中j为正整数,其中W表示所述第二编码中间字节的字节个数。
根据任意整数得到相应的无符号整数A,再通过第一种编码策略对无符号整数A进行编码时,删除第一编码中间字节中只包括0的字节,将无符号整数A的二进制字节的数据长度进行有效压缩,生成了数据长度较小的第一编码字节,也就是将任意整数编码为数据长度较小的第一编码字节,可以有效降低整数在二进制流中占用的体积大小,从而提高二进制流即数据的I/O的传输效率。
较优地,在上述技术方案中,所述第一种编码策略模块220还用于:
若i<P时,不对所述二进制字节进行右移,并在所述二进制字节的首字节前补充第一零字节:00000000,得到所述第一编码中间字节,防止对二进制字节进行右移后使整数发生改变。
较优地,在上述技术方案中,所述第一种编码策略模块220还用于:
当所述第二编码中间字节的首字节的前1+j位中包括1时和/或当2(7-j)+8W<A时,在所述第二编码中间字节的首字节前补充至少一个第二零字节:00000000,再将首个所述第二零字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,得到所述第一编码字节。防止直接对第二编码中间字节的首字节的前1+j位直接进行替换导致整数发生改变。
较优地,在上述技术方案中,所述第一种编码策略模块220还用于:
当N=2时,设置P=6,j=1,第二编码中间字节的首字节的前2位为0X,X为0或1,其中,当X为0时,表示第一编码字节的数据长度为1个字节,X为1时,表示第一编码字节的数据长度为2个字节;
当N=4时,设置P=5,j=2,第二编码中间字节的首字节的前3位为0XX,其中,当XX为00时,表示第一编码字节的数据长度为1个字节,依此类推,当XX为11时,表示第一编码字节的数据长度为3个字节;
当N=8时,设置P=4,j=3,第二编码中间字节的首字节的前4位为0XXX,其中,当XXX为000时,表示第一编码字节的数据长度为1个字节,依此类推,当XXX为111时,表示第一编码字节的数据长度为8个字节。
较优地,在上述技术方案中,还包括第二种编码策略模块,所述第二种编码策略模块用于:阈值判断模块判定当N=2且二进制字节的首字节大于0x3F时、当N=4且二进制字节的首字节大于0x1F时和/或当N=8且二进制字节的首字节大于0x0F时,第二种编码策略模块将二进制字节按照第二种编码策略进行编码,形成相应的第二编码字节。
较优地,在上述技术方案中,所述第二种编码策略模块具体用于:在二进制字节的首字节前补充前导字节:10000000,将二进制字节紧随在前导字节之后,生成第二编码字节。
较优地,在上述技术方案中,还包括第一种解码策略模块,所述第一种解码策略模块用于:当需要所述二进制字节时,利用与所述第一种编码策略相对应的第一种解码策略对所述第一编码字节进行解码,得到所述二进制字节。
较优地,在上述技术方案中,还包括第二种解码策略模块,所述第二种解码策略模块用于:当需要所述二进制字节时,利用与所述第二种编码策略相对应的第二种解码策略对所述第二编码字节进行解码,得到所述二进制字节。
且上述关于本发明的一种变长整数的通用编码系统200中的各参数和步骤,可参考上文中关于一种变长整数的通用编码方法的实施例中的各参数和步骤,在此不做赘述。
本发明实施例的一种电子设备,包括存储器、处理器及存储在存储器上并在处理器上运行的程序,处理器执行程序时实现上述任一实施例的一种变长整数的通用编码方法的步骤。
根据任意整数得到相应的无符号整数,再通过第一种编码策略对无符号整数进行编码时,删除第一编码中间字节中只包括0的字节,将无符号整数的二进制字节的数据长度进行有效压缩,生成了数据长度较小的第一编码字节,也就是将任意整数生成了数据长度较小的第一编码字节,可以有效降低整数在二进制流中占用的体积大小,从而提高二进制流即数据的I/O的传输效率。
其中,电子设备可以选用电脑、手机等,相对应地,其程序为电脑软件或手机APP等。
且上述关于本发明的一种电子设备中的各参数和步骤,可参考上文中关于一种变长整数的通用编码方法的实施例中的各参数和步骤,在此不做赘述。
在本发明中,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。
Claims (10)
1.一种变长整数的通用编码方法,其特征在于,包括如下步骤:
S1、根据任意整数得到相应的无符号整数A,并将所述无符号整数A生成数据长度为N个字节的二进制字节,其中,N为正整数;
S2、当N=2且所述二进制字节的首字节不大于0x3F时、当N=4且所述二进制字节的首字节不大于0x1F时和/或当N=8且所述二进制字节的首字节不大于0x0F时,将所述二进制字节按照第一种编码策略进行编码,形成相应的第一编码字节;
其中,所述将所述二进制字节按照第一种编码策略进行编码,形成相应的第一编码字节,包括:
S20、当所述二进制字节的后i位均为0且i≥P时,将所述二进制字节右移P位,得到第一编码中间字节,其中,i>0且i为整数,P为正整数;
S21、删除所述第一编码中间字节中只包括0的字节,得到第二编码中间字节;
S22、当所述第二编码中间字节的首字节的前1+j位中不包括1时,且当2(7-j)+8W≥A时,将所述第二编码中间字节的首字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,然后得到所述第一编码字节,其中j为正整数,其中W表示所述第二编码中间字节的字节个数。
2.根据权利要求1所述的一种变长整数的通用编码方法,其特征在于,所述S20中还包括:
S200、当i<P时,不对所述二进制字节进行右移,并在所述二进制字节的首字节前补充第一零字节:00000000,得到所述第一编码中间字节。
3.根据权利要求2所述的一种变长整数的通用编码方法,其特征在于,所述S22中还包括:
S220、当所述第二编码中间字节的首字节的前1+j位中包括1时和/或当2(7-j)+8W<A时,在所述第二编码中间字节的首字节前补充至少1个第二零字节:00000000,再将所述第二零字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,得到所述第一编码字节。
4.根据权利要求3所述的一种变长整数的通用编码方法,其特征在于,还包括:
当N=2时,设置P=6,j=1,所述第二编码中间字节的首字节的前2位为0X,X为0或1,其中,当X为0时,表示所述第一编码字节的数据长度为1个字节,X为1时,表示所述第一编码字节的数据长度为2个字节;
当N=4时,设置P=5,j=2,所述第二编码中间字节的首字节的前3位为0XX,其中,当XX为00时,表示所述第一编码字节的数据长度为1个字节,依此类推,当XX为11时,表示所述第一编码字节的数据长度为3个字节;
当N=8时,设置P=4,j=3,所述第二编码中间字节的首字节的前4位为0XXX,其中,当XXX为000时,表示所述第一编码字节的数据长度为1个字节,依此类推,当XXX为111时,表示所述第一编码字节的数据长度为8个字节。
5.根据权利要求4所述的一种变长整数的通用编码方法,其特征在于,还包括:
S2000、当N=2且所述二进制字节的首字节大于0x3F时、当N=4且所述二进制字节的首字节大于0x1F时和/或当N=8且所述二进制字节的首字节大于0x0F时,将所述二进制字节按照第二种编码策略进行编码,形成相应的第二编码字节。
6.根据权利要求5所述的一种变长整数的通用编码方法,其特征在于,所述将所述二进制字节按照第二种编码策略进行编码,形成相应的第二编码字节,包括:
在所述二进制字节的首字节前补充前导字节:10000000,将所述二进制字节紧随在所述前导字节之后,生成所述第二编码字节。
7.根据权利要求1至4任一项所述的一种变长整数的通用编码方法,其特征在于,还包括:
当需要所述二进制字节时,利用与所述第一种编码策略相对应的第一种解码策略对所述第一编码字节进行解码,得到所述二进制字节。
8.根据权利要求6所述的一种变长整数的通用编码方法,其特征在于,还包括:
当需要所述二进制字节时,利用与所述第二种编码策略相对应的第二种解码策略对所述第二编码字节进行解码,得到所述二进制字节。
9.一种变长整数的通用编码系统,其特征在于,包括生成模块和第一种编码策略模块;
所述生成模块用于根据任意整数得到相应的无符号整数A,并将所述无符号整数A生成数据长度为N个字节的二进制字节,其中,N为正整数;
所述第一种编码策略模块用于当N=2且所述二进制字节的首字节不大于0x3F时、当N=4且所述二进制字节的首字节不大于0x1F时和/或当N=8且所述二进制字节的首字节不大于0x0F时,将所述二进制字节按照第一种编码策略进行编码,形成相应的第一编码字节;
所述第一种编码策略模块具体用于:
当所述二进制字节的后i位均为0且i≥P时,将所述二进制字节右移P位,得到第一编码中间字节,其中,i>0且i为整数,P均为正整数;
删除所述第一编码中间字节中只包括0的字节,得到第二编码中间字节;
当所述第二编码中间字节的首字节的前1+j位中不包括1时,且当2(7-j)+8W≥A时,将所述第二编码中间字节的首字节的首位设置为固定位:0,将紧随所述固定位的后j位设置为表示所述第一编码字节的数据长度的二进制数,然后得到所述第一编码字节,其中j为正整数,其中W表示所述第二编码中间字节的字节个数。
10.一种电子设备,包括存储器、处理器及存储在所述存储器上并在所述处理器上运行的程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至8任一项所述的一种变长整数的通用编码方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010454887.7A CN111600610B (zh) | 2020-05-26 | 2020-05-26 | 一种变长整数的通用编码方法、系统及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010454887.7A CN111600610B (zh) | 2020-05-26 | 2020-05-26 | 一种变长整数的通用编码方法、系统及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111600610A CN111600610A (zh) | 2020-08-28 |
CN111600610B true CN111600610B (zh) | 2023-04-28 |
Family
ID=72186493
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010454887.7A Active CN111600610B (zh) | 2020-05-26 | 2020-05-26 | 一种变长整数的通用编码方法、系统及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111600610B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112699639B (zh) * | 2021-02-09 | 2022-03-04 | 北京微步在线科技有限公司 | 整数数据的存储方法、装置及存储介质 |
CN113644986B (zh) * | 2021-08-25 | 2023-07-11 | 上海幻电信息科技有限公司 | 编码方法、编码装置、计算设备及计算机可读存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109871520A (zh) * | 2019-02-28 | 2019-06-11 | 魏勇 | 一种适用于http内容内嵌的二进制数据编解码方法 |
Family Cites Families (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6005503A (en) * | 1998-02-27 | 1999-12-21 | Digital Equipment Corporation | Method for encoding and decoding a list of variable size integers to reduce branch mispredicts |
US6925467B2 (en) * | 2002-05-13 | 2005-08-02 | Innopath Software, Inc. | Byte-level file differencing and updating algorithms |
US7068192B1 (en) * | 2004-08-13 | 2006-06-27 | Google Inc. | System and method for encoding and decoding variable-length data |
US7609000B1 (en) * | 2007-10-22 | 2009-10-27 | Google Inc. | Variable-length compression technique for encoding or decoding a sequence of integers |
US9195675B2 (en) * | 2011-02-24 | 2015-11-24 | A9.Com, Inc. | Decoding of variable-length data with group formats |
CN103279462B (zh) * | 2013-05-28 | 2016-02-17 | 浙江大学 | 一种适用于北斗短报文民用协议的数据编码/解码方法 |
CN104283567B (zh) * | 2013-07-02 | 2018-07-03 | 北京四维图新科技股份有限公司 | 一种名称数据的压缩、解压缩方法及设备 |
JP5626440B2 (ja) * | 2013-12-13 | 2014-11-19 | 大日本印刷株式会社 | 数値データ列の符号化/復号化の方法および装置 |
CN105306063B (zh) * | 2015-10-12 | 2018-11-02 | 浙江大学 | 一种记录型数据存储空间的优化与恢复方法 |
CN105740215A (zh) * | 2016-01-23 | 2016-07-06 | 北京掌阔移动传媒科技有限公司 | 一种数据通信编码和解码方法 |
CN107919943B (zh) * | 2016-10-11 | 2020-08-04 | 阿里巴巴集团控股有限公司 | 二进制数据的编码、解码方法和装置 |
CN106549673B (zh) * | 2016-10-27 | 2020-02-21 | 深圳市金证科技股份有限公司 | 一种数据压缩方法及装置 |
CN106849956B (zh) * | 2016-12-30 | 2020-07-07 | 华为机器有限公司 | 压缩方法、解压缩方法、装置和数据处理系统 |
CN107645700B (zh) * | 2017-09-21 | 2020-10-27 | 数据通信科学技术研究所 | 一种基于ussd协议的移动通信数据传输方法 |
CN110011863B (zh) * | 2019-05-05 | 2022-05-03 | 北京思特奇信息技术股份有限公司 | 一种网络带宽资源均衡调度方法及装置 |
CN110995281B (zh) * | 2019-12-21 | 2024-02-27 | 中国电波传播研究所(中国电子科技集团公司第二十二研究所) | 一种适合测井电缆传输的可变码长rs编码方法 |
-
2020
- 2020-05-26 CN CN202010454887.7A patent/CN111600610B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109871520A (zh) * | 2019-02-28 | 2019-06-11 | 魏勇 | 一种适用于http内容内嵌的二进制数据编解码方法 |
Also Published As
Publication number | Publication date |
---|---|
CN111600610A (zh) | 2020-08-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6903668B1 (en) | Decompression accelerator for flash memory | |
CN111600610B (zh) | 一种变长整数的通用编码方法、系统及电子设备 | |
US20030085822A1 (en) | High performance memory efficient variable-length coding decoder | |
US5818369A (en) | Rapid entropy coding for data compression or decompression | |
EP1134901A1 (en) | Method and apparatus for data compression of network packets employing per-packet hash tables | |
RU2725763C1 (ru) | Способы и устройства для кодирования и декодирования двоичных данных | |
JP2011512730A (ja) | テンプレート式のパラメータを使用したメッセージの符号化および復号化 | |
US6919826B1 (en) | Systems and methods for efficient and compact encoding | |
US7605721B2 (en) | Adaptive entropy coding compression output formats | |
US7111094B1 (en) | System, method and algorithm for the optimization of entropy for lossless compression | |
US6748520B1 (en) | System and method for compressing and decompressing a binary code image | |
CN113220651B (zh) | 运行数据压缩方法、装置、终端设备以及存储介质 | |
JPH05183443A (ja) | 符号変換方法 | |
CN1748369A (zh) | 用于文本数据压缩的方法和设备 | |
Lekatsas et al. | Arithmetic coding for low power embedded system design | |
Al-Bahadili et al. | A bit-level text compression scheme based on the ACW algorithm | |
US5708431A (en) | Method for compression coding of potentially unbounded integers | |
CN115167869A (zh) | 一种Java对象序列化和反序列化的方法、电子设备及介质 | |
CN1656688B (zh) | 在压缩之前处理数字数据 | |
CN113890540A (zh) | 一种并行加速lz77解码方法及装置 | |
TWI645698B (zh) | 資料發送裝置、資料接收裝置及其方法 | |
US20020166041A1 (en) | Data mask coding | |
JP2800538B2 (ja) | 可変長ビット列処理プロセッサ | |
EP0494038A2 (en) | Run-length encoding in extensible character sets | |
EP3149947B1 (en) | Dedicated arithmetic encoding instruction |
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 |