【问题标题】:Convert long numbers to base 256 number system将长数字转换为以 256 为基础的数字系统
【发布时间】:2023-03-25 05:30:02
【问题描述】:

我需要将表示为字符串的非常大长度(可能大于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]

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

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

【问题讨论】:

  • 您可以使用一些大整数库将其转换为 base-16 数字,然后将每两个十六进制数字合并,这样您就可以获得 base-256 数字。

标签: javascript node.js math biginteger


【解决方案1】:

你很幸运。主流浏览器*现在原生支持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 sn-p 或 JSFiddle 运行。

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

【讨论】:

  • 感谢您的回答!但是,我发现节点 don't support BigInt 的旧版本,所以我必须通过实现我自己的函数来处理长除法和模数字符串。
猜你喜欢
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多