Это не так уж и много по сравнению с решением Натана Хьюза, но чем длиннее строки, тем больше вы экономите.
Кодировка: создайте строку, начинающуюся с «1», делая каждое из чисел в исходной строке 2 цифрами, таким образом, «0» становится «00», «5» становится «05», «99» становится «99» и т. д. Представьте полученное число в базе 36.
Декодирование: Возьмите число 36 / строку base 36, измените его на основание 10, пропустите первые «1», затем превратите каждые 2 цифры / буквы в int и восстановите исходную строку.
Пример кода:
String s = "1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,0,4,0,0,0,4,0,3";
// ENCODE the string
StringTokenizer tokenizer = new StringTokenizer(s,",");
StringBuilder b = new StringBuilder();
b.append("1"); // This is a primer character, in case we end up with a bunch of zeroes at the beginning
while(tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken().trim();
if(token.length()==1) {
b.append("0");
b.append(token);
}
else {
b.append(token);
}
}
System.out.println(b);
// We get this String: 101020000000000000000000000000000000000010202030004000000040003
String encoded = (new BigInteger(b.toString())).toString(36);
System.out.println(encoded);
// We get this String: kcocwisb8v46v8lbqjw0n3oaad49dkfdbc5zl9vn
// DECODE the string
String decoded = (new BigInteger(encoded, 36)).toString();
System.out.println(decoded);
// We should get this String: 101020000000000000000000000000000000000010202030004000000040003
StringBuilder p = new StringBuilder();
int index = 1; // we skip the first "1", it was our primer
while(index<decoded.length()) {
if(index>1) {
p.append(",");
}
p.append(Integer.parseInt(decoded.substring(index,index+2)));
index = index+2;
}
System.out.println(p);
// We should get this String: 1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,0,4,0,0,0,4,0,3
Я не знаю, как можно легко превратить большое число в основание 64. Тщательно выбранные символы (например, +, , -) вполне подходят для кодирования URL, поэтому 0-9, az, AZ, с "" и "-" составляет 64. Метод BigInteger.toString () принимает значение только до Character.MAX_RADIX, который равен 36 (без заглавных букв). Если вы можете найти способ взять большое число и перейти на основание 64, то результирующая закодированная строка будет еще короче.
РЕДАКТИРОВАТЬ: похоже, это делает это для вас: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html