带基数的Java数字> Character.MAX_RADIX

时间:2011-04-27 11:39:11

标签: java tostring radix

我有一个五个字符的字符串,我想将这五个字符用作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的源代码并扩展可能的数字外,还有其他地方我应该研究,首先,这已经实现了吗?

2 个答案:

答案 0 :(得分:4)

如果您愿意使用超出字母数字的两个字符,则可以使用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);

答案 1 :(得分:3)

您没有指定字符是否需要可打印 ASCII:

  • 如果他们这样做,那么您可以转到95^5。从空格(SP)到波浪号(〜)有95个可打印的ASCII字符。

  • 如果他们不这样做,那么您可以转到128^5 == 2^35

无论哪种方式,执行转换的算法都很简单,并且比Long.toString(...)的扩展简单。 (你可能不必担心字符<->数字映射中的符号,范围错误或漏洞。从头开始编写代码会更容易。)

但是,我不知道任何现有的扩展基数的实现。