如何在JavaScript中转换不同基数之间的数字?

Yve*_*ves 61 javascript

我想在不同的基数之间转换数字,例如十六进制和十进制.

示例:如何将十六进制转换8F为十进制?

aeh*_*lke 92

API

要从十六进制字符串转换为数字:

parseInt(string, radix)
Run Code Online (Sandbox Code Playgroud)
  • string:必需.要解析的字符串

  • radix:可选.一个数字(从2到36)代表要使用的数字系统

要从数字转换为十六进制字符串:

NumberObject.toString(radix)
Run Code Online (Sandbox Code Playgroud)
  • radix:可选.指定您希望数字显示为的基本基数.

示例基数值:

  • 2 - 数字将显示为二进制值
  • 8 - 该数字将显示为八进制值
  • 16 - 该数字将显示为十六进制值

示例用法

十六进制的整数值:

var i = 10;
console.log( i.toString(16) );
Run Code Online (Sandbox Code Playgroud)

十六进制字符串到整数值:

var h = "a";
console.log( parseInt(h, 16) );
Run Code Online (Sandbox Code Playgroud)

整数值到十进制:

 var d = 16;
 console.log( d.toString(10) );
Run Code Online (Sandbox Code Playgroud)

  • 对于大于36的基数,这会失败,因为`toString`会抛出一个`RangeError`.大型基地显然没有意义表示为角色. (4认同)

Rya*_*ith 15

我来到这个帖子需要从基数10转换为62,反之亦然.虽然这里的解决方案很棒,parseInt并且toString只支持2到36的基础.所以,如果有人发现自己处于类似于我需要2到62位的位置,我已经在下面粘贴了我的解决方案.

https://gist.github.com/ryansmith94/91d7fd30710264affeb9

function convertBase(value, from_base, to_base) {
  var range = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/'.split('');
  var from_range = range.slice(0, from_base);
  var to_range = range.slice(0, to_base);
  
  var dec_value = value.split('').reverse().reduce(function (carry, digit, index) {
    if (from_range.indexOf(digit) === -1) throw new Error('Invalid digit `'+digit+'` for base '+from_base+'.');
    return carry += from_range.indexOf(digit) * (Math.pow(from_base, index));
  }, 0);
  
  var new_value = '';
  while (dec_value > 0) {
    new_value = to_range[dec_value % to_base] + new_value;
    dec_value = (dec_value - (dec_value % to_base)) / to_base;
  }
  return new_value || '0';
}
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于> 2 ^ 53的数字。 (2认同)

Sla*_*ser 12

您可以尝试以下代码,它也支持任意精度数字(大于2^53)。

function convertBase(str, fromBase, toBase) {

    const DIGITS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/";

    const add = (x, y, base) => {
        let z = [];
        const n = Math.max(x.length, y.length);
        let carry = 0;
        let i = 0;
        while (i < n || carry) {
            const xi = i < x.length ? x[i] : 0;
            const yi = i < y.length ? y[i] : 0;
            const zi = carry + xi + yi;
            z.push(zi % base);
            carry = Math.floor(zi / base);
            i++;
        }
        return z;
    }

    const multiplyByNumber = (num, x, base) => {
        if (num < 0) return null;
        if (num == 0) return [];

        let result = [];
        let power = x;
        while (true) {
            num & 1 && (result = add(result, power, base));
            num = num >> 1;
            if (num === 0) break;
            power = add(power, power, base);
        }

        return result;
    }

    const parseToDigitsArray = (str, base) => {
        const digits = str.split('');
        let arr = [];
        for (let i = digits.length - 1; i >= 0; i--) {
            const n = DIGITS.indexOf(digits[i])
            if (n == -1) return null;
            arr.push(n);
        }
        return arr;
    }

    const digits = parseToDigitsArray(str, fromBase);
    if (digits === null) return null;

    let outArray = [];
    let power = [1];
    for (let i = 0; i < digits.length; i++) {
        digits[i] && (outArray = add(outArray, multiplyByNumber(digits[i], power, toBase), toBase));
        power = multiplyByNumber(fromBase, power, toBase);
    }

    let out = '';
    for (let i = outArray.length - 1; i >= 0; i--)
        out += DIGITS[outArray[i]];

    return out;
}
Run Code Online (Sandbox Code Playgroud)

用法:

console.log(convertBase("5a2a9c826c75045be9ba8fbffc80c6f25a2a9c826c75045be9ba8fbffc80c6f2",16,64));
// Returns: 5EGD89ItghrWrGfL/O0NL9qaFO2r7k4m+CWzX/YwcrO

console.log(convertBase("5EGD89ItghrWrGfL/O0NL9qaFO2r7k4m+CWzX/YwcrO",64,16));
// Returns: 5a2a9c826c75045be9ba8fbffc80c6f25a2a9c826c75045be9ba8fbffc80c6f2
Run Code Online (Sandbox Code Playgroud)

基本代码可以在这里找到,我对其进行了一些改进,以支持最高 64 位。

  • @Zibri,对不起,IDK。但欢迎您自己转换并在此处与他人分享。 (2认同)

Rus*_*Cam 8

指定要用作参数的基数.

注意:这仅适用于从基数2-36转换为十进制和值.

parseInt(string, radix) 

parseInt("80", 10) // results in 80
parseInt("80", 16) // results in 128
// etc
Run Code Online (Sandbox Code Playgroud)

关于"小",parseInt("6f", 32)是好的(= 207),
但其他大一点也将是207, 6f1,6f11,...

  • @RussCam我没有downvote,但我认为这是因为这个答案仅限于转换为十进制,这确实解决了给定的例子,但问题是"在不同的基础之间".(我毫不怀疑这六年来一直困扰着你.) (3认同)

Nur*_*Nur 8

此函数生成从 2 到 36 的任何基数的十进制数。(就像 javascript)

但是您可以通过添加新字符来将基数增加到 36以上,keys[]例如小写 ["a","b"]

function toBase(num, radix = 10) { // only i64 numbers
  var keys = ['', '', 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
  if (!(radix >= 2 && radix <= keys.length)) throw new RangeError("toBase() radix argument must be between 2 and " + keys.length)

  if (num < 0) var isNegative = true
  if (isNaN(num = Math.abs(+num))) return NaN

  let output = [];
  do {
    let index = num % radix;
    output.unshift(keys[index]);
    num = Math.trunc(num / radix);
  } while (num != 0);
  if (isNegative) output.unshift('-')
  return output.join("");
}

console.log(toBase("100",2)) 
Run Code Online (Sandbox Code Playgroud)


小智 7

好吧,我做了一个可以从基数10翻译到任何基数的函数.(这取决于你在数组中有多少个字符串A,如果它超过+ 10,它将用完符号),当我发现你可以用不到10个字符时,我几乎哭了.. .

添加一个书签,并作为URL插入此...我已经完成了很长但个性化的方式.至少,我可以使用高于36的基础.您可以自己添加更多符号,但如果您愿意,我可以为您制作...

var X = prompt("Choose your number");
var Y = prompt("Choose your base");
var Z = [];
var M = -1;
var A = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
var B = function() {
    for (i = X; 0 < i; i = Math.floor(i / Y)) { 
        if(i % Y >= 10) { 
            Z.push(A[i % Y - 10]);
        } else { 
            Z.push(i % Y);
        } 
        M = M + 1;
    } 
    for (j = M; j >= 0; j--) {
        document.write(Z[j]);
    } 
};

B(); // Call function
Run Code Online (Sandbox Code Playgroud)


Mar*_*ari 7

下图可能会有所帮助.请注意,要从基数16转换为基数2,您需要先转换为基数10,然后转换为基数2.

基本转换


pun*_*nov 5

通常我使用此功能从不同的基础转换.

例如,它为两种情况返回"11111111": convertBase("ff",16,2 )convertBase(0xFF,16,2)

var convertBase = function(val, base1, base2) {
    if (typeof(val) == "number") {
        return parseInt(String(val)).toString(base2);
    } else {
        return parseInt(val.toString(), base1).toString(base2)
    };
}
Run Code Online (Sandbox Code Playgroud)