将长数字转换为 base 256 数字系统
Convert long numbers to base 256 number system
我需要将表示为字符串的非常大长度(可能大于 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 以外的基本转换。
这样做的最佳算法是什么?
你很幸运。主流浏览器*现在原生支持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 中使用。
注意:这个问题最初没有用 node.js 标记,所以我没有考虑到这一点。由于 OP 提出了这个问题,BigInt 支持被添加到 NodeJS 10.4,所以这段代码应该 运行 与那个版本和所有后续版本。
我需要将表示为字符串的非常大长度(可能大于 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 以外的基本转换。
这样做的最佳算法是什么?
你很幸运。主流浏览器*现在原生支持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 中使用。
注意:这个问题最初没有用 node.js 标记,所以我没有考虑到这一点。由于 OP 提出了这个问题,BigInt 支持被添加到 NodeJS 10.4,所以这段代码应该 运行 与那个版本和所有后续版本。