最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

jquery - how to encodedecode ascii85 in javascript - Stack Overflow

programmeradmin0浏览0评论

I was looking for an alternative to Base64 which works fine on Unicode characters. I have found ASCII85 which works great however I found no code or command doing that in JS.

I just found this link which does not work for international characters and does not include decode function.

Here there are online Decoder/Encoder.

Even found codes in C language doing that(I don't have enough JS data handling knowledge to convert).

And some codes that I don't know how to run.

I have heard that JQuery does support Base64 but it seems that it does not support Ascii85.

Does somebody know anything about Ascii85 in JS which might help?

thanks

I was looking for an alternative to Base64 which works fine on Unicode characters. I have found ASCII85 which works great however I found no code or command doing that in JS.

I just found this link which does not work for international characters and does not include decode function.

Here there are online Decoder/Encoder.

Even found codes in C language doing that(I don't have enough JS data handling knowledge to convert).

And some codes that I don't know how to run.

I have heard that JQuery does support Base64 but it seems that it does not support Ascii85.

Does somebody know anything about Ascii85 in JS which might help?

thanks

Share Improve this question edited May 23, 2017 at 11:54 CommunityBot 11 silver badge asked Jun 19, 2013 at 7:00 gerrnargerrnar 4171 gold badge7 silver badges15 bronze badges 3
  • 1 The question is, why do you need Base64 to begin with, and why isn't UFT-8 good enough ? – adeneo Commented Jun 19, 2013 at 7:07
  • What is wrong with UTF-8? Or any standard encoding? – Precastic Commented Jun 19, 2013 at 7:08
  • I use ASCII85 not to leave direct access to a string array. It is better than obfuscation. it is not issue of security but issue of data rights. – gerrnar Commented Jun 19, 2013 at 7:12
Add a comment  | 

4 Answers 4

Reset to default 9

Pure JavaScript Ascii85 AKA Base85 encoding/decoding functions:

function encode_ascii85(a) {
  var b, c, d, e, f, g, h, i, j, k;
  for (!/[^\x00-\xFF]/.test(a), b = "\x00\x00\x00\x00".slice(a.length % 4 || 4), a += b, 
  c = [], d = 0, e = a.length; e > d; d += 4) f = (a.charCodeAt(d) << 24) + (a.charCodeAt(d + 1) << 16) + (a.charCodeAt(d + 2) << 8) + a.charCodeAt(d + 3), 
  0 !== f ? (k = f % 85, f = (f - k) / 85, j = f % 85, f = (f - j) / 85, i = f % 85, 
  f = (f - i) / 85, h = f % 85, f = (f - h) / 85, g = f % 85, c.push(g + 33, h + 33, i + 33, j + 33, k + 33)) :c.push(122);
  return function(a, b) {
    for (var c = b; c > 0; c--) a.pop();
  }(c, b.length), "<~" + String.fromCharCode.apply(String, c) + "~>";
}

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);
}

var myString='This is a test!';
var encoded=encode_ascii85(myString);
var decoded=decode_ascii85(encoded);
document.write(decoded);

using dojo.js framework :

Decode Example + source

Encode Example + source

ascii85 Encoding using

summary:

dojo.require("dojox.encoding.ascii85");
var dc = dojox.encoding
var buf = dc.ascii85.decode("")
var a85 = dc.ascii85.encode("");

You can use my JavaScript ASCII85 (Base85) implementation which can work both with byte arrays and strings

For those of you who would like a loquacious version of Dave Brown's answer (reverse engineered from his answer and tested):

function encode_ascii85(sSource) {
    var sSuffix, iStringLength, f;
    var charArray = [];

    if (!/[^\x00-\xFF]/.test(sSource)) {
        [sSource, sSuffix, iStringLength] = initForLoop(sSource);

        for (var iIndex = 0; iStringLength > iIndex; iIndex += 4) {
            f = (sSource.charCodeAt(iIndex) << 24) + (sSource.charCodeAt(iIndex + 1) << 16);
            f = f + (sSource.charCodeAt(iIndex + 2) << 8) + sSource.charCodeAt(iIndex + 3);

            appendNextChar(f, charArray);
        }
        (function truncate(oArray, b) {
            for (var m = b.length; m > 0; m--) oArray.pop();
        })(charArray, sSuffix);

        return "<~" + String.fromCharCode.apply(String, charArray) + "~>";
    } else {
        // Error Handling
    }

    function initForLoop(a) {
        var sSuffix = "\x00\x00\x00\x00".slice(a.length % 4 || 4);
        return [a += sSuffix, sSuffix, a.length];
    }

    function appendNextChar(f, oArray) {
        if (f === 0) {
            oArray.push(122);
        } else {
            var g, h, i, j, k;
            k = f % 85, f = (f - k) / 85;
            j = f % 85, f = (f - j) / 85;
            i = f % 85, f = (f - i) / 85;
            h = f % 85, f = (f - h) / 85;
            g = f % 85;
            oArray.push(g + 33, h + 33, i + 33, j + 33, k + 33);
        }
    }
}

function decode_ascii85(sSource) {
    var sSuffix, d, iStringLength;
    var charArray = [];

    if ("<~" === sSource.slice(0, 2) && "~>" === sSource.slice(-2)) {
        sSource = initForLoop(sSource);

        for (var iIndex = 0; iStringLength > iIndex; iIndex += 5) {
            var x = "charCodeAt";
            var w = 255;

            d = 85 * 85 * 85 * 85 * (sSource[x](iIndex) - 33) + 85 * 85 * 85 * (sSource[x](iIndex + 1) - 33);
            d = d + 85 * 85 * (sSource[x](iIndex + 2) - 33) + 85 * (sSource[x](iIndex + 3) - 33) + (sSource[x](iIndex + 4) - 33);

            charArray.push(w & d >> 24, w & d >> 16, w & d >> 8, w & d);
        }
        (function truncate(oArray, b) {
            for (var m = b.length; m > 0; m--) oArray.pop();
        })(charArray, sSuffix);

        return String.fromCharCode.apply(String, charArray);
    } else {
        // Error Handling
    }

    function initForLoop(a) {
        var z = "replace",
            y = "slice";

        a = a[y](2, -2)[z](/\s/g, "")[z]("z", "!!!!!");
        sSuffix = "uuuuu" [y](a.length % 5 || 5);
        a += sSuffix;
        iStringLength = a.length;

        return a;
    }

}
发布评论

评论列表(0)

  1. 暂无评论