12

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

4

2 回答 2

4

如果您愿意超出字母数字两个字符,则可以使用Base64编码。

Base64Apache 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);
于 2011-04-27T11:47:49.180 回答
3

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

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

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

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

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

于 2011-04-27T12:16:59.313 回答