Попробуйте преобразовать BigInt в Hex в JavaScript - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь получить большое целое число, представленное как шестнадцатеричное.

Соответствующий код выглядит так:

function get_rule() {
    // returns a really big binary string
    str = '';
    while (str.length < 256) {
    str += Math.round(Math.random()).toString();
    }
    return str;
}

rule = get_rule();
bint = BigInt(parseInt(rule, 2))
hex = bint.toString(16)

bint оказывается правильным числом, но идет шестнадцатеричный до 14 цифр, которые выглядят как шестнадцатеричные, за которыми следует тонна нулей.

например, bint может иметь вид

58206388421090005193052022432882355508306939736292565684115432891377355063296n

, а шестнадцатеричный будет

"80afa5fb68780800000000000000000000000000000000000000000000000000"

Как решить эту проблему?

1 Ответ

2 голосов
/ 21 июня 2020

Проблема

Вы используете parseInt, который преобразует строку в число, но число в JavaScript - это всего лишь 64-битное число с плавающей запятой, что намного меньше, чем вам нужно. (Максимальное безопасное значение - только 9007199254740991 MAX_SAFE_INTEGER )

Решение

BigInt принимает числа как строку, поэтому просто не анализируйте его. MDN . Чтобы указать, что это двоичное число, используйте префикс 0b

function get_rule() {
    // returns a really big binary string
    str = '';
    while (str.length < 256) {
    str += Math.round(Math.random()).toString();
    }
    return str;
}

rule = get_rule();
bint = BigInt('0b'+rule)
hex = bint.toString(16)

console.log(bint.toString(2))
console.log(rule.replace(/^0+/, '')) //remove all leading zeroes
console.log(hex)
...