‘壹’ C++对一长度为22的数字字符串,无损压缩为16位字符串,并且可逆。有什么好的算法
长度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码
当然乘除可以用移位运算代替,速度更快
‘贰’ 数字的无损压缩算法那些比较合适
一种新的算法,解决了压缩比低、压缩与解压缩的速度慢和格式不通用的问
题。这个《数字无损压缩与解压缩算法》(下面简称算法)有一个卓越的功能,
就是压缩、压缩……在压缩,最终压缩结果为900位的数据,注:(每1位只有0
或1两种状态),这种算法也可以对现在的DVD光盘直接进行无损压缩,压缩率为
90%以上。算法结构非常简单,硬件易构建。是真正意义的无损压缩,下面简单
讲一下算法的功能和原理。
功能1、压缩率为90%以上,如果硬件允许,算法本身的压缩率可做到98%以上
,压缩最小数据量为1200位,压缩结果为900位的数据。为了有90%的
压缩率,所以:(1200位+1200位)×2×2=9600位,实际应用最小数
据为9600位,压缩结果为900位。
2、算法速度取决硬件构建,因为我对硬件不懂,还不能解释,但我要说
:算法结构非常简单。
3、压缩对象:只要是一连串的0或1组成的数据,就可以压缩。不管是图
像数据,还是音频数据或各种进制,都能在这一种算法中进行压缩与
解压缩,而压缩率和速度都是一样的。
4、实时压缩与解压缩,这个还要看硬件构建情况,才能回答,用我个人
的说法是:处处有余的。
原理1、跟现在的无损压缩,有损压缩和混合原理,完全不同,先讲布局,布
局是一个45格×45格的正方形,共有2025个空格,用来寄存数据的只
有1200空格,(每1个空格只能寄存0或1两种状态),1200个空格既
能寄存1200位的数据量,其余825个空格另做它用,下面将这个布局
称为子模型。
2、对子模型进行算法,定位算法,只对数据中的1进行定位算法,不进
行定位算法的既是0,写入子模型的1200数据,定位算法结果数据为900
位。
3、五个子模型,组成一个完整的算法,数据经过两次压缩,原始数据96
00位,压缩成了900位的数据,每增加1次压缩,压缩的数据量就得扩
大为前1次被压缩的数据量的2倍。既9600位×2=19200位,压缩结果数据
有是不同的900位,这样就在次扩大了压缩率。
原始数据9600位→(压缩算法)→压缩结果数据为900位
001001……1001 001001……10010000
算法是设计好了,只需专家的鉴定和硬件的构建,希望有更多的专业人士把这
种算法设计到芯片上去。对《数字无损压缩与解压缩》的方法或技术有兴趣的朋
友,我们可以一同交流一下。
‘叁’ C语言 解压缩字符串
#include<stdio.h>
intmain()
{
chars[50],s1[100];
inti=0,j=0,k,n;
gets(s);//输入压缩后的字符串
while(s[i])
{
s1[j]=s[i];
//因为形式是先字符后数字,所以第一个肯定是字符,先赋入另一个数组以便后续操作。
i++;j++;//递增,开始处理下一位的数字
n=0;
while(s[i]>='0'&&s[i]<='9')//只要是数字就要进入循环统计
{
n*=10;
n+=s[i]-'0';
i++;
}
for(k=0;k<n-1;k++)
//因为解压缩的字符已经存入数组s1,所以只剩下n-1要再放入s1
s1[j+k]=s1[j-1];
if(n>0)//注意,一定要n>0因为有可能是连续字符,本来就没被压缩这时如果还把j加上n-1就反而是让j减小了。
j+=n-1;
}
s1[j]='