我的工作项目是使用Jackson JSON序列化程序将一堆Java对象转换为字符串,以便将它们发送到REST服务。
其中一些对象包含敏感数据,因此我编写了自定义序列化程序,将这些对象序列化为JSON字符串,然后对它们进行gzip,然后使用AES
加密它们;
这会将字符串转换为字节数组,因此我使用Apache commons
编解码器中的Base64编码器将字节数组转换为字符串。 REST接口背后的自定义反序列化器可以反转此过程:
base64 decode -> decrypt -> decompress -> deserialize using default Jackson deserializer.
Base64
编码增加了输出的大小(序列化中的gzip步骤旨在帮助改善这种增加),所以我检查了Google是否有更有效的替代方法,这导致我{{ 3}}之前的stackoverflow线程,它将this编码作为一种更有效的替代方案 -
Base64
增加了33%的输出大小,Ascii85
增加了25%的输出大小。
我发现了一些Java Ascii85实现,例如Apache pdfbox,但我有点谨慎使用编码 - 看起来几乎没有人使用或实现它,这可能只是意味着Base64有更多的惯性,或者可能反而意味着有些不稳定Ascii85的问题。
有人对这个问题有更多了解吗? Ascii85有什么问题,这意味着我应该使用Base64吗?
答案 0 :(得分:11)
Base64 方式更常见。在大多数情况下,大小的差异确实不是 ,如果您在HTTP级别(将压缩base64)而不是在的有效负载中添加,可能会发现差异完全消失。
Ascii85是否有任何问题意味着我应该使用Base64?
我强烈建议使用base64只是因为它所以更广泛。这几乎是将二进制数据表示为文本的规范方式(当然,除非你想使用十六进制)。
答案 1 :(得分:3)
ASCII85是一种很好的编码,用于保存额外的空间。但是,如果通过HTTP天真地发送,它会输出许多需要转义的字符。 Base64编码有一个变种,可以通过HTTP发送而不需要任何转义。
这是一个javascript ASCII85编码器,以防任何人需要尝试:
// By Steve Hanov. Released to the public domain.
function encodeAscii85(input) {
var output = "<~";
var chr1, chr2, chr3, chr4, chr, enc1, enc2, enc3, enc4, enc5;
var i = 0;
while (i < input.length) {
// Access past the end of the string is intentional.
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
chr4 = input.charCodeAt(i++);
chr = ((chr1 << 24) | (chr2 << 16) | (chr3 << 8) | chr4) >>> 0;
enc1 = (chr / (85 * 85 * 85 * 85) | 0) % 85 + 33;
enc2 = (chr / (85 * 85 * 85) | 0) % 85 + 33;
enc3 = (chr / (85 * 85) | 0 ) % 85 + 33;
enc4 = (chr / 85 | 0) % 85 + 33;
enc5 = chr % 85 + 33;
output += String.fromCharCode(enc1) +
String.fromCharCode(enc2);
if (!isNaN(chr2)) {
output += String.fromCharCode(enc3);
if (!isNaN(chr3)) {
output += String.fromCharCode(enc4);
if (!isNaN(chr4)) {
output += String.fromCharCode(enc5);
}
}
}
}
output += "~>";
return output;
}
<input onKeyUp="result.innerHTML = encodeAscii85(this.value)" placeholder="write text here" type="text">
<p id="result"></p>
答案 2 :(得分:2)
以下是JavaScript中匹配的ASCII85 AKA Base85解码器(适用于用户Qwerty):
function decode_ascii85(a) {
var c, d, e, f, g, h = String, l = "length", w = 255, x = "charCodeAt", y = "slice", z = "replace";
for ("<~" === a[y](0, 2) && "~>" === a[y](-2), a = a[y](2, -2)[z](/\s/g, "")[z]("z", "!!!!!"),
c = "uuuuu"[y](a[l] % 5 || 5), a += c, e = [], f = 0, g = a[l]; g > f; f += 5) d = 52200625 * (a[x](f) - 33) + 614125 * (a[x](f + 1) - 33) + 7225 * (a[x](f + 2) - 33) + 85 * (a[x](f + 3) - 33) + (a[x](f + 4) - 33),
e.push(w & d >> 24, w & d >> 16, w & d >> 8, w & d);
return function(a, b) {
for (var c = b; c > 0; c--) a.pop();
}(e, c[l]), h.fromCharCode.apply(h, e);
}
&#13;
<input onKeyUp="result.innerHTML = decode_ascii85(this.value)" placeholder="insert encoded string here" type="text">
<p id="result"></p>
example: <xmp><~<+oue+DGm>@3BW*D/a<&+EV19F<L~></xmp>
&#13;