首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Base64编码与Ascii85编码

Base64编码与Ascii85编码
EN

Stack Overflow用户
提问于 2012-11-16 05:05:25
回答 3查看 11K关注 0票数 16

我正在进行的项目是使用Jackson JSON序列化程序将一组Java对象转换为String,以便将它们发送到REST服务。

其中一些对象包含敏感数据,因此我编写了自定义序列化程序来将这些对象序列化为JSON字符串,然后对它们进行压缩,然后使用AES对它们进行加密;

这会将字符串转换为字节数组,因此我使用Apache commons编解码器中的Base64编码器将字节数组转换为字符串。REST接口背后的自定义反序列化程序逆转了这个过程:

base64 decode -> decrypt -> decompress -> deserialize using default Jackson deserializer.

Base64编码增加了输出的大小(序列化中的gzip步骤是为了帮助改善这种增加),所以我查看了谷歌,看看是否有更有效的替代方案,这导致我使用this上一个将Ascii85编码作为更有效替代方案的堆栈溢出线程。

Base64使输出大小增加了33%,Ascii85使输出大小增加了25%。

我发现了一些Java Ascii85实现,例如Apache pdfbox,但我对使用编码有点怀疑--似乎几乎没有人在使用或实现它,这可能只是意味着Base64有更多的惯性,或者这可能意味着Ascii85存在一些不稳定的问题。

有没有人对这个主题有更多的了解?有没有什么问题意味着我应该使用Base64来代替Ascii85?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-16 05:35:46

Base64更为常见。在大多数情况下,大小的差异并不明显,如果您在HTTP层(这将压缩base64)而不是在有效负载中添加,那么您很可能会发现差异完全消失了。

Ascii85有什么问题需要我改用Base64吗?

我强烈建议使用base64,因为它的使用范围要广泛得多。这几乎是将二进制数据表示为文本的规范方法(当然,除非您想使用十六进制)。

票数 17
EN

Stack Overflow用户

发布于 2015-04-02 22:45:43

ASCII85是一种很好的编码,可以用来节省额外的空间。但它输出了许多字符,如果通过HTTP发送,则需要对这些字符进行转义。Base64编码有一个变体,可以通过HTTP发送,而不需要任何转义。

这里有一个javascript ASCII85编码器,以防任何人需要尝试:

代码语言:javascript
复制
// 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;
}
代码语言:javascript
复制
<input onKeyUp="result.innerHTML = encodeAscii85(this.value)" placeholder="write text here" type="text">
<p id="result"></p>

票数 8
EN

Stack Overflow用户

发布于 2015-07-31 16:11:39

这是匹配的ASCII85 AKA Base85解码器(适用于用户Qwerty),在JavaScript中:

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
<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>

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13406189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档