将长数字转换为基数 256 数字系统

问题描述

我需要将表示为字符串的非常大的长度(可能大于 Number.MAX_SAFE_INTEGER)的数字转换为以 256 为基数的数字系统。
像这样:

console.log(convert_to_base_256("10")); //-> [10]
console.log(convert_to_base_256("1024"); //-> [4,0]
console.log(convert_to_base_256("123456")); //-> [1,226,64]

我知道我可以使用大整数库,但它们中的大多数不支持超过 base 62 的 base 转换。

这样做的最佳算法是什么?

解决方法

你很幸运。主要浏览器*现在原生支持 BigInt,因此您可以通过一些简单的算术来完成您需要的操作。

let bigString = "123456";
    let bigOne = BigInt(bigString);

    let base256 = [];
    do {
        base256.unshift(Number(bigOne%256n));   // Use Number constructor to cast result
        bigOne = bigOne/256n;
    } while (bigOne)

    console.log(base256);   // [ 1,226,64 ]

* 我在 Firefox 89、Chrome 90 和 Edge 90 中运行它。我无法让它作为 SO 片段或在 JSFiddle 中工作。

注意:这个问题最初没有用 标记,所以我没有考虑。由于 OP 提出了该问题,因此 NodeJS 10.4 中添加了 BigInt 支持,因此此代码应与该版本和所有后续版本一起运行。