JavaScriptで書いたascii85 Encoderがうまく動かない
JavaScriptでascii85encoderを作っているのですが、encode後の値がすこし違うものになってしまいます。
なぜなのでしょうか?
例えば、ascii85 Python encoder(base64.a85encode)に"Hello"のバイト列を渡すと87cURDZ
となりますが、この関数(ascii85encode)では87cURDZBb;
となってしまいます。
function ascii85encode(arr) {
let str = "";
let a = [];
for (let i = 0; i < arr.length; i++) {
a.push(arr[i]);
if (a.length === 4) {
let res = ascii85_str(a);
str += res;
a = [];
}
}
if (a.length > 0) {
for (let t = 0; t < 4 - a.length; t++) {
//足りないところを0で埋める。
a.push(0);
}
str += ascii85_str(a, true);
}
return str
};
function ascii85_str(nums, last=false) {
const uint32 = createUInt32(nums);
const str = base85_num(uint32, last);
if (str === "!!!!!") {
str = "z";
}
return str;
};
function createUInt32(a) {
if (a.length > 4) {
throw new Error("createUInt32 argument must be a four elements list of UInt8");
}
return (a[0] << 24 | a[1] << 16 | a[2] << 8 | a[3]);
};
function base85_num(n, l = false) {
//引数としてわたってきたブロックの値(32bit値)を85進数の値(0~84)に変換
n = Math.abs(n);
let res = [];
for (let p = 0; p < 5; p++) {
let s = String.fromCodePoint((n%85) + 33)
res.unshift(s);
n = parseInt(n / 85);
if (l && n === 0) { //与えられた値が最後のブロックでかつ、nがゼロ(これ以上余りが出ない)ならそこで終了
break;
}
}
return res.join("");
};
export { ascii85encode };