我需要用尽可能短的字符串表示非常大和小的数字.这些数字是未签名的.我已经尝试过直接的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编码将使其更长,大约三分之一.它不应该缩短它,而是允许以非二进制安全的格式安全地传输二进制数据.
然而,基数64比数字(或字节数据)的十进制表示更紧凑,即使它比基数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(长度为19个字符)相比,长度为11个字符.最多约1600万的数字仅适合4个字符.那差不多就像你得到它一样短. (从技术上讲,还有另外两个不需要在URL中编码的字符:.
and ~
.你可以将这些字符加入到基数66中,对于某些数字来说这将是一个较短的smidgin,尽管这看起来有点迂腐.)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。