我有一个五个字符的字符串,我想使用这五个字符作为一个ASCII编码(可打印)数字。实现这一目标的最简单方法是使用
Long.toString(number, Character.MAX_RADIX);这将给我从"0"到"zzzzz"的号码。不幸的是,Long.toString(int, int)只支持小写字母,不支持大写字母.这意味着最大基数是36,而我可以编码的最高数字是36^5 - 1 = 60 466 175。如果我可以同时使用较低的和大写字母,我将得到62的最大基数,最高可编码数是62^5 - 1 = 916 132 831。
除了复制Long的源代码和扩展可能的数字之外,还有什么地方我应该去看看,首先,这里已经实现了吗?
发布于 2011-04-27 12:16:59
您没有指定字符是否需要为可打印的 ASCII:
95^5。从空间(SP)到倾斜(~)有95个可打印的ASCII字符。128^5 == 2^35。无论哪种方式,进行转换的算法都是简单的,并且比Long.toString(...)的扩展更简单。(您大概不必担心字符<->数字映射中的符号、范围错误或漏洞。从零开始编写代码会更容易。)
但是,我不知道扩展基数的任何现有实现。
发布于 2011-04-27 11:47:49
如果您愿意使用字母数字以外的两个字符,则可以使用Base64编码。
使用来自Base64的Apache Commons Codec,您可以获得1073741824个可能的值,如下所示:
byte bytes[] = new byte[4];
bytes[0] = (byte) ((value >> 24) & 0xFF);
bytes[1] = (byte) ((value >> 16) & 0xFF);
bytes[2] = (byte) ((value >> 8) & 0xFF);
bytes[3] = (byte) (value & 0xFF);
String encoded = Base64.encodeBase64String(bytes).substring(1, 6);https://stackoverflow.com/questions/5803454
复制相似问题