压缩字符串为数字


把一个长度为20左右的字符串压缩为integer,并且可以解压出来..
各位大侠帮帮忙..
分不够了可以再加

37 个解决方案

#1


该回复于2009-06-04 11:25:43被版主删除

#2


没弄明白楼主什么意思

#3


单个字符转成ASCII码再转成字符是不是要这样?还是要加密?

#4


没见过这种玩法

#5


啥意思?20个字符每个转换为integer?还是20个字符压缩为1个integer?

#6


感觉你说的是加密....

#7


也可以说是加密..
举个例子吧.
比如:
  s := 'jfej2_3jf';
  经转换后S变为22213,反转换后S又还原了..
想要找个这样的算法.S的长度在20左右..
意思是把S转换成不超过integer范围的数字

#8


想法不错,
你这个替代时简单
但还原时就没规律性可循了!

#9


引用 7 楼 yych1987 的回复:
也可以说是加密..
举个例子吧.
比如:
s := 'jfej2_3jf';
经转换后S变为22213,反转换后S又还原了..
想要找个这样的算法.S的长度在20左右..
意思是把S转换成不超过integer范围的数字

还有这种事情?
如果有一个字符串有1M,那加密之后就只有一个数字了
这压缩比是多少啊?自己算算,还不能超过integer的范围?扯淡吧

#10


噢,没见着,长度在20左右。

#11


顶下先

#12


做一个表,存储2^32个字符串,然后查表

#13


把12楼这条狗屁答复给删掉  

以前有人这样问过。据说有个什么算法....一直搞不懂:怎么可能?

#14


...不让我删除..没有权限..

#15


Zlib.pas和 Zlibconst.pas 好像可以压流

#16


如果字符串不是很有规律,100^20==2^32,怎么可能?

s := 'jfej2_3jf'; 
经 什么规律的转换后 S才能变为22213???

#17


目前只想到用字典算法可以做,不过加密和解码程序都会大很多

#18


2+3=5

如果你不知道上面的过程

X+Y=5

你能求出唯一的X,Y分别是多少嘛?

#19


这个问题挺有意思,
如果字符串中的可能出现的单个字符不超过100种的话
是可以做的,如16楼所言100^20==2^32,integer最多也只能表示100种字符排列结合20次


所以请楼主给出字符串内容的范围
0~9,10个数字
a~z及A~Z共52个字母
符号有多少个,分别是什么,列出来,
如果符号不超过38个,我可以试着写一下这个算法
如果还包含了有非标准ASC字符,比如汉字的话……无能为力了

#20


引用 19 楼 b43ok 的回复:
这个问题挺有意思, 
如果字符串中的可能出现的单个字符不超过100种的话 
是可以做的,如16楼所言100^20==2^32,integer最多也只能表示100种字符排列结合20次 


所以请楼主给出字符串内容的范围 
0~9,10个数字 
a~z及A~Z共52个字母 
符号有多少个,分别是什么,列出来, 
如果符号不超过38个,我可以试着写一下这个算法 
如果还包含了有非标准ASC字符,比如汉字的话……无能为力了

计算错误,当我没说!!

#21



首先肯定下想法是挺有创意,但可行性要分析下:

觉得16楼,说的有一定道理,我们用反向法来推敲一下:
假设有一种算法实现了你的想法;
由于  : 一个标准整数通常=2^32=4294967296.
又因为: 20位任意字符的组合数远远大于 2^32  .
所以  : 必须,至少其中有一个整数可以表达2个不同的20位的字符组合串.

而 同一个整数能被解释为两个不同字符串么?
答案显然不能,
所以,反过来证明假设是错误的.

但是,这件事情,可以有条件的成立,成立的前提条件就是:
    必须限制字符串的组合数,至少不能是任意组合,只要你能把字符组合数限制在最大整数范围内,才有可能实现你的想法;

#22


引用 21 楼 xjlqlqlq 的回复:
首先肯定下想法是挺有创意,但可行性要分析下: 

觉得16楼,说的有一定道理,我们用反向法来推敲一下: 
假设有一种算法实现了你的想法; 
由于  : 一个标准整数通常=2^32=4294967296. 
又因为: 20位任意字符的组合数远远大于 2^32  . 
所以  : 必须,至少其中有一个整数可以表达2个不同的20位的字符组合串. 

而 同一个整数能被解释为两个不同字符串么? 
答案显然不能, 
所以,反过来证明假设是错误的. 

但是,这件事情,…

先谢谢各位大侠的解答..呵呵
范围是['a'..'z','A'..'Z','_','0'..'9']

#23


那也太大了:63^20远大于2^32

#24


63^20=9.7008767986634971679096921938014e+35
2^32=4.294967296 e+10

#25


太有意思了,一个int32能用16进制表示的ascii字符是8个,很显然,只由16个字符表达的信息存在很大的冗余
如果能把20个字符压缩成4字节,那接下来可以把这4字节变成8字节,于是两个半int32又凑成了一个20字节包含大量冗余信息的字符串
接下来又可以把这20个字符压成4字节,又可以两个半重复上面的过程
于是奇迹出现了,整个宇宙的信息两个半两个半的压缩成了4字节

楼主,如果谁发现了这个算法,100分算个毛,卖硬盘的厂商都可以破产是小事,整个信息论被改写也是小事,大事是我们所在的宇宙已经被改变了,全部的数与逻辑都可以改写了。能做出这个来的绝对不是人,而是神,但是神会为了你那点儿不够用了再加的没用的破分儿改变这个宇宙么?

#26


用Int64型,把字符串的每个转换成字符ASC码相加后再转成INT64,这样你自己在加入算法,要还原时,用你加入的算法返算回来,就能得到你原来的ASC码的字符,但要注意用CHR返回字符时所取的长度,ASC码有1位、2位、3位的,这个你自己就要相方法解决了。
ORD('a')=97
ORD('z')=122
ORD('A')=65
ORD('Z')=90
要是字符‘AZ’就可以转成'6590'

#27


如果是纯英文的,可以把每个字节压缩到6位甚至是5位,考虑到熵值可能可以压缩到4位。
如果你精通压缩的话,也许int64可以达到,但是你得准备解压缩的时候出问题。

#28


引用 13 楼 lihuasoft 的回复:
把12楼这条狗屁答复给删掉   

以前有人这样问过。据说有个什么算法....一直搞不懂:怎么可能?


想反悔了?呵呵

#29


楼主是从哪里看到的,还是突发奇想?
字符串编码成一个Integer是没有问题的,但过程是不可逆的.

#30


突发奇想的..呵呵..
自己费了老半天劲也不得要领来请教这里的各位大侠呢

#31


我今天问我老大了,
好像说有个什么哈夫曼树及哈夫曼编码 
那个可以

#32


引用 31 楼 qkhhxkj102 的回复:
我今天问我老大了, 
 好像说有个什么哈夫曼树及哈夫曼编码  
 那个可以 
  
 

那要搞熵什么的,而且未必能压缩到楼主的要求。

#33


除非建一个字典,只能是字典里有的字符串,字典条目数不超过32^2。

压缩的时候如果字典里没有就是非法字符串,解压的时候直接查字典就是了。

#34


15楼里的那两个,加参数 -h 好像就是huffman

#35


引用 31 楼 qkhhxkj102 的回复:
我今天问我老大了, 
好像说有个什么哈夫曼树及哈夫曼编码 
那个可以 

他肯定自己就没实现过huffman tree,小白问小白,然后还跑过来答小白

#36


sql版没问题,delphi在升级中??

#37


算术编码
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告