长度22的数字字符串表示的应该是0至10^23-1
即0到9999....9 (22个9)
一个字符串占一个字节8位,理论上最多表示2^8-1,0~255个状态,
或者说一个字节无符号整数范围是0~255
要无损压缩0至10^23-1范围内的整数,至少需要二进制77位(23/log10(2))
你所说的16位字符串是只16个字符串把,也就是16字节,128位吧,
如果是的话,压缩还是很有冗余的,要是小于77为二进制数,就不可能无损压缩了
最简单的就是用4位二进制码表示1个十进制数
4位二进制码有16中可能,取其中的10中可能表示十进制0~1
那么每两位十进制数就用一个字节表示,22位,只需要11个字节就够了
数字字符0~9的ascii码是48~57(十六进制30~39),只保留低四位就是0~9
两个10进制数给占4位,占一个字节
压缩编码的时候,从十进制低位起,每两个数字一组(个位和十位,百位和千位.....)
(低位的ascii-48) +(高位的ascii-48)*16 获得一个字节
22位的数字,能够获得11个字节的数据,如果要16个字节的话,就有5个字节的冗余
解码的时候,从低到高获得每个字节
字节数据/16的商+48 就是高位的ascii码
字节数据/16的余数+48 就是地位的ascii码
当然乘除可以用移位运算代替,速度更快