0

我想将 Uint8Array(或 ArrayBuffer)中的字节编码和解码到 Base36 中的字符串。JavaScript 有toStringparseInt函数,它们都支持 base36,但我不确定首先将 8 字节转换为 64 位浮点是否是正确的想法。

在 JS 中,可以在 Base36 中编码一个 BigInt(任意长度的数字)。然而另一个方向不起作用

我怎样才能做到这一点?

4

1 回答 1

0

我在这两篇文章的帮助下找到了解决方案:为什么 JavaScript base-36 转换似乎很模糊以及如何在 JS BigInts 和 TypedArrays 之间进行转换

function bigIntToBase36(num){
    return num.toString(36);
}

function base36ToBigInt(str){
    return [...str].reduce((acc,curr) => BigInt(parseInt(curr, 36)) + BigInt(36) * acc, 0n);
}

function bigIntToBuffer(bn) {
    let hex = BigInt(bn).toString(16);
    if (hex.length % 2) { hex = '0' + hex; }

    const len = hex.length / 2;
    const u8 = new Uint8Array(len);

    let i = 0;
    let j = 0;
    while (i < len) {
        u8[i] = parseInt(hex.slice(j, j+2), 16);
        i += 1;
        j += 2;
    }

    return u8;
}

function bufferToBigInt(buf) {
    const hex = [];
    const u8 = Uint8Array.from(buf);

    u8.forEach(function (i) {
        var h = i.toString(16);
        if (h.length % 2) { h = '0' + h; }
        hex.push(h);
    });

    return BigInt('0x' + hex.join(''));
}

const t1 = new Uint8Array([123, 51, 234, 234, 24, 124, 2, 125, 34, 255]);
console.log(t1);
const t2 = bigIntToBase36(bufferToBigInt(t1));
console.log(t2);
console.log(t2.length)
const t3 = bigIntToBuffer(base36ToBigInt(t2));
console.log(t3);

于 2021-08-16T12:19:13.430 回答