大家有什么高招? 用这个s.Remove(parm1,parm2);parm1是要移除字符在s中的起点,parm2为要移除得字符数返值就是s中剩下的字符 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我还要可以还原啊,用s.Remove(parm1,parm2);怎么还原, 我有个想法,讲出来请您不要笑俺哦:)如果都是英文字母(当然其他字符也可,只不过计算方法修改一下),我们可以用0代表a,用25代表z,用26代表A,用51代表Z,把0~51称为字母的压缩码,那么我的压缩办法是:intSum = C0*64^0+C1*64^1+C2*64^2+...(其中Cx为第x个字母的压缩码),"opkkd"有5个字母,intSum的最大值为64^4=16777216(实际上不可能达到这么大),正好是256^3,所以至少可以压缩成3位,这里还没有考虑对两个k的处理,当然怎么来存储以及怎么来解压,我想不是什么难题:)请多多指教。 http://search.csdn.net/Expert/topic/2587/2587811.xml?temp=.6048242 hhshh(蜀山浪子),你这个方法应该不可以,你怎么解压啊?没有C0.c1.你怎么把他转换回来这是不行的把? hhshh(蜀山浪子)的方法可行的哦,前提是只有字符串A-Z,这样的话,算上大写小写,总共只有52个字符而6个bit位可以表示64个字符!(所以还可以算上数字符号)也就是,0~5位表示第一个字符,6~11位表示第二个字符,and so on-----------------------|0~5|6~11|……|24~29| |-----------------------所以32位可以表示5个char就是,4个char可以压缩为5个char解压缩就很明了了是吧?? 还是不太明白,intSum = C0*64^0+C1*64^1+C2*64^2+...(其中Cx为第x个字母的压缩码),他把这个加起来是什么意思啊?在讲清楚点啊 能说一下你压缩他的意义吗?如果是为了保密,.net中有加密算法呀? 技术细节可以如下:定义一个uint型数组A[]先使A[] = A[] & 0 //将A清0接着根据字符串,将其转换到A[]里(此时A里保存的是值小于64的数据,具体的转换根据你自己的定义)接着就是for(i = 0; i < Length; i++){ result |= A[i] >> i*6} 看样子还要把字符串的转换也给出来……最简单的for(i;;){ swith(tmp) //tmp 为要转换的字符 { case 'a': A[i] = 1; //具体等于什么你自己定义 break; case 'b':…… }} result |= A[i] >> i*6,这个应该不行吧,你怎么解压,这个是可以压缩,但不可以还原啊,右移不行的 不好意思,回帖后一直没时间来解释我思路,我给出一段程序,已经经过调试,但要说明:1、仅对英文字母有效;2、为了简单明了,仅压缩"opkkd",如果要实现通用性,需要修改程序,但可能程序比较长,这里主要是想说明我的压缩思路;//压缩函数,传入待压缩的字符串,返回经压缩后的byte数组private byte[] ZipString(string str){ int intTmp = 0; byte[] bytTmp = new byte[4]; //为了简单,直接定长 byte[] bytS = Encoding.Default.GetBytes(str); for(int i = 0;i < bytS.Length;i++) { //移位操作,实现公式intSum = C0*64^0+C1*64^1+C2*64^2+... intTmp = intTmp + (bytS[i] - 65) * (1 << (i*6)); } //把压缩好的数据放入byte数组 int j = 0; while(intTmp > 0) { bytTmp[j++] = Convert.ToByte(intTmp % 256); intTmp = intTmp / 256; } return bytTmp;}//解压与压缩相反private string UnZipString(byte[] bytS){ string strTmp; byte[] bytTmp = new byte[6]; //为了简单,直接定长 long intTmp = 0; for(int i = 0;i < bytS.Length;i++) { intTmp = intTmp + Convert.ToInt32(bytS[i] * (1 << (i*8))); } int j = 0; while(intTmp > 0) { if(intTmp < 64) { bytTmp[j] = Convert.ToByte(intTmp + 65); } else { bytTmp[j] = Convert.ToByte(intTmp % 64 + 65); } intTmp = intTmp / 64; j++; } strTmp = Encoding.Default.GetString(bytTmp); return strTmp;}程序涉及的面比较窄,我仅仅想说明一下我压缩思路。TO:tear_pearl(tear_pearl) 多谢您的支持和理解:) 测试例子:string str = "opkkd";byte[] bytTest = ZipString(str);string str1 = UnZipString(bytTest);可以看一下压缩后的bytTest数组占用的存储空间仅3个字节;经过解压后的str1与压缩前的str一样:)如果有什么不妥之处敬请指出。 hhshh(蜀山浪子)和tear_pearl(tear_pearl),谢谢你们哦,真是厉害啊佩服佩服。虽然现在我们不用压缩了,但还是谢谢你们哦,我们现在只压缩数字的,呵呵。hhshh(蜀山浪子),你的想法很好,但表示出来确实很是困难啊。呵呵 请问如何在C#的代码中控制Expression上的按钮是否显示呢? VS2005 C#开发类库 C#中的安装部署问题? 寻求串口通讯示例代码?? 请教一个文件更新的思路(在线等----------) 动态引用DLL创建的对象怎么为属性赋值? WCF与网站的通信 求助下简单正则"泸州3.41米落" 求获取字符串内的数字 请问!如何在winform提交以前用htmlForm提交的数据? 求助:想找一个软件生成序列号的算法 c#.net 初学者?请多多指教!
这是不行的把?
前提是只有字符串A-Z,这样的话,算上大写小写,总共只有52个字符
而6个bit位可以表示64个字符!(所以还可以算上数字符号)
也就是,0~5位表示第一个字符,6~11位表示第二个字符,and so on
-----------------------
|0~5|6~11|……|24~29| |
-----------------------
所以32位可以表示5个char
就是,4个char可以压缩为5个char
解压缩就很明了了是吧??
先使A[] = A[] & 0 //将A清0接着根据字符串,将其转换到A[]里
(此时A里保存的是值小于64的数据,具体的转换根据你自己的定义)接着就是
for(i = 0; i < Length; i++)
{
result |= A[i] >> i*6
}
最简单的
for(i;;)
{
swith(tmp) //tmp 为要转换的字符
{
case 'a':
A[i] = 1; //具体等于什么你自己定义
break;
case 'b':
……
}
}
1、仅对英文字母有效;
2、为了简单明了,仅压缩"opkkd",如果要实现通用性,需要修改程序,但可能程序比较长,这里主要是想说明我的压缩思路;//压缩函数,传入待压缩的字符串,返回经压缩后的byte数组
private byte[] ZipString(string str)
{
int intTmp = 0;
byte[] bytTmp = new byte[4]; //为了简单,直接定长
byte[] bytS = Encoding.Default.GetBytes(str);
for(int i = 0;i < bytS.Length;i++)
{
//移位操作,实现公式intSum = C0*64^0+C1*64^1+C2*64^2+...
intTmp = intTmp + (bytS[i] - 65) * (1 << (i*6));
} //把压缩好的数据放入byte数组
int j = 0;
while(intTmp > 0)
{
bytTmp[j++] = Convert.ToByte(intTmp % 256);
intTmp = intTmp / 256;
}
return bytTmp;
}//解压与压缩相反
private string UnZipString(byte[] bytS)
{
string strTmp;
byte[] bytTmp = new byte[6]; //为了简单,直接定长
long intTmp = 0;
for(int i = 0;i < bytS.Length;i++)
{
intTmp = intTmp + Convert.ToInt32(bytS[i] * (1 << (i*8)));
}
int j = 0;
while(intTmp > 0)
{
if(intTmp < 64)
{
bytTmp[j] = Convert.ToByte(intTmp + 65);
}
else
{
bytTmp[j] = Convert.ToByte(intTmp % 64 + 65);
}
intTmp = intTmp / 64;
j++;
}
strTmp = Encoding.Default.GetString(bytTmp);
return strTmp;
}
程序涉及的面比较窄,我仅仅想说明一下我压缩思路。TO:tear_pearl(tear_pearl)
多谢您的支持和理解:)
byte[] bytTest = ZipString(str);
string str1 = UnZipString(bytTest);可以看一下压缩后的bytTest数组占用的存储空间仅3个字节;经过解压后的str1与压缩前的str一样:)如果有什么不妥之处敬请指出。
佩服佩服。虽然现在我们不用压缩了,但还是谢谢你们哦,我们现在只压缩数字的,
呵呵。
hhshh(蜀山浪子),你的想法很好,但表示出来确实很是困难啊。呵呵