我有一个五个字符的字符串,我想将这五个字符用作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
的源代码并扩展可能的数字外,还有其他地方我应该研究,首先,这已经实现了吗?
答案 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(...)
的扩展简单。 (你可能不必担心字符<->
数字映射中的符号,范围错误或漏洞。从头开始编写代码会更容易。)
但是,我不知道任何现有的扩展基数的实现。