我需要用尽可能短的字符串表示非常大和非常小的数字。这些数字是无符号的。我尝试过直接使用 Base64 编码,但对于一些较小的数字,编码后的字符串比仅将数字存储为字符串要长。在保证 URL 安全的情况下,以最佳方式将非常大或非常短的数字存储在可能的最短字符串中的最佳方法是什么?
最佳答案
I have tried just straight Base64 encode, but for some smaller numbers, the encoded string is longer than just storing the number as a string
二进制字节数据的 Base64 编码会使其更长,大约三分之一。它不应该使其更短,而是允许以非二进制安全的格式安全传输二进制数据。
然而,base 64 比数字(或字节数据)的十进制表示更紧凑,即使它不如 base 256(原始字节数据)紧凑。直接以 base 64 编码您的数字将使它们比十进制更紧凑。这将做到:
private static final String base64Chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
static String encodeNumber(long x) {
char[] buf = new char[11];
int p = buf.length;
do {
buf[--p] = base64Chars.charAt((int)(x % 64));
x /= 64;
} while (x != 0);
return new String(buf, p, buf.length - p);
}
static long decodeNumber(String s) {
long x = 0;
for (char c : s.toCharArray()) {
int charValue = base64Chars.indexOf(c);
if (charValue == -1) throw new NumberFormatException(s);
x *= 64;
x += charValue;
}
return x;
}
使用这种编码方案,Long.MAX_VALUE
将是字符串 H__________
,与其十进制表示形式 9223372036854775807
相比,它有 11 个字符长这是 19 个字符长。最多约 1600 万的数字将仅适合 4 个字符。那是你能得到的最短的时间。 (从技术上讲,还有两个不需要在 URL 中编码的字符:.
and ~
。您可以合并它们以获得 base 66,这对于某些数字来说会稍微短一些,尽管这看起来有点迂腐。)
关于java - 用最少的字符表示长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27559449/