你需要这么多空间存储数字,因为你使用十进制来表示它们。一种改进方法是使用十六进制(hex)。例如,你可以将255(3位数字)表示为ff(2位数字)。
你可以通过使用更大的数字基数来进一步扩展这个概念...所有有效的查询字符串参数字符集:
A-Z、a-z、0-9、'.'、'-'、'~'、'_'、'+'
这给了你一个包含67个字符的基数(参见QueryString的
Wikipedia)。
请查看
此SO帖子以了解将十进制转换为任意数字基数的方法。
编辑:
在链接的SO帖子中,请查看以下部分:
string xx = IntToString(42,
new char[] { '0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'});
这几乎是你所需要的。只需添加它缺少的几个字符,就可以扩展它:
yz.-~_+
那篇文章缺少回到十进制的方法。我不会写 :-) 但是过程如下:
定义一个计数器,我称之为TOTAL。
查看最右边的字符,并找到它在数组中的位置。
TOTAL =(字符在数组中的位置)
例如:输入为BA1。现在TOTAL为1(因为“1”位于数组的第1个位置)
现在查看第一个字符左侧的下一个字符,并找到它在数组中的位置。
TOTAL += 47 *(字符在数组中的位置)
例如:输入为BA1。现在TOTAL为(47 * 11)+1 = 518
现在查看前一个字符左侧的下一个字符,并找到它在数组中的位置。
TOTAL += 47 * 47 *(字符在数组中的位置)
例如:输入为BA1。总计现在为(47 * 47 * 10)+(47 * 11)+1 = 243508
依此类推。
我建议您编写一个单元测试,将一堆十进制数字转换为47进制,然后再转回来,以确保您的转换代码正常工作。
请注意,您用3个47进制数字表示了一个6位十进制数字 :-)
-1000000000
,然后在服务器端添加回来:D。但说真的,我看不出这样做的理由。你应该实现一个更好的系统。你需要这样做的确切原因是什么?你遇到了什么问题? - Noon Silk