【发布时间】:2012-08-01 07:41:14
【问题描述】:
我有一串数字,我想缩短它以在 URL 中使用。该字符串始终仅由数字组成。例如:9587661771112
理论上,将数字字符串加密为字母数字(0-9a-zA-Z)字符串应该总是返回更短的结果,这正是我想要的。
我创建了一个执行以下操作的算法:
加密(string1 = 数字输入字符串,string2 = 字母数字返回字符串)
- 从 string1 中取出接下来的两个字符并将它们转换为一个数字,例如上面示例中的 95
- 检查数字是否小于 52(a-z 和 A-Z 的组合长度)
- 如果是这样,将 ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")[Number] 添加到 string2 并向前跳转 2 个字符
- 否则,将 ("0123456789)[First digit of Number) 添加到 string2 并向前跳转 1 个字符
在下一步中,数字将是 58,依此类推。
经过一些调整,我能得到的最短结果是:9587661771112 > j9UQpjva
我的问题是,使用这种技术,结果可能会有很大差异。我也觉得这不是我的问题的干净解决方案。
所以我需要一个加密算法,将一串数字转换成更短的大写字母、小写字母和数字串。它必须是可解密的并且具有或多或少一致的结果。
知道如何实现吗?
解决方案:
string Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
string Base10To62(long N)
{
string R = "";
while (N != 0)
{
R += Chars[(int)(N % 62)];
N /= 62;
}
return R;
}
long Base62To10(string N)
{
long R = 0;
int L = N.Length;
for (int i = 0; i < L; i++)
{
R += Chars.IndexOf(N[i]) * (long)Math.Pow(62, i);
}
return R;
}
像魅力一样工作:)
【问题讨论】:
-
我认为正确的术语是 compressing - 而不是 encrypting。
-
你确实可以称之为压缩,但我的意图也是或多或少地保护字符串不被编辑!
-
您只需要将数字从 10 进制转换为 52 进制(请参阅stackoverflow.com/questions/923771/…)。忘记这里的“加密”——“加密”和“较短的字符串”不能放在一起。
-
嗨,Thomas - 如果您有解决方案,那么最好的办法是发布您自己问题的答案 - 这样可以更清楚地了解问题与解决方案是什么,并且其他人可以支持您的答案:)
-
Bugs: 0 导致 Base10To62 的输出为空字符串;前导零丢失,因此并非所有数字字符串都可以编码。
标签: c# encoding compression numeric alphanumeric