Wie konvertiert man Zahlen zwischen verschiedenen Basen in JavaScript?

76

Ich möchte Zahlen zwischen verschiedenen Basen wie Hexadezimal und Dezimal konvertieren.

Beispiel: Wie konvertiert man Hexadezimal8Fin Dezimal?

Yves
quelle

Antworten:

113

Die API

So konvertieren Sie eine Hex-Zeichenfolge in eine Zahl:

parseInt(string, radix)
  • Zeichenfolge: Erforderlich. Die zu analysierende Zeichenfolge

  • radix: Optional. Eine Zahl (von 2 bis 36), die das zu verwendende Zahlensystem darstellt

So konvertieren Sie von einer Zahl in eine Hex-Zeichenfolge:

NumberObject.toString(radix)
  • radix: Optional. Gibt den Basisradix an, unter dem die Nummer angezeigt werden soll.

Beispiel Radix-Werte:

  • 2 - Die Zahl wird als Binärwert angezeigt
  • 8 - Die Zahl wird als Oktalwert angezeigt
  • 16 - Die Zahl wird als Hexadezimalwert angezeigt

Beispiel Verwendung

Ganzzahliger Wert für hex:

var i = 10;
console.log( i.toString(16) );

Hex-Zeichenfolge zu ganzzahligem Wert:

var h = "a";
console.log( parseInt(h, 16) );

Ganzzahliger Wert in Dezimalzahl:

 var d = 16;
 console.log( d.toString(10) );

aehlke
quelle
das ist noch besser. umkehren.
Yves
Ich sehe nicht, wie der erste in hexadezimal konvertiert. Kannst du es bitte erklären? Darüber hinaus führt die zweite hexadezimal und nicht dezimal wie angegeben aus.
Russ Cam
@Russ Cam: Die erste verwendet die Basis als Parameter - hexadezimal ist Basis 16 - und gibt eine Zeichenfolge der Darstellung dieser Zahl in dieser Basis zurück. Sie sind in Bezug auf die Sekunde falsch - es ergibt sich tatsächlich ein Dezimalwert.
Aehlke
@Wahnfrieden - Ich habe falsch interpretiert, was du sagen würdest. Es ist mir jetzt klar :)
Russ Cam
5
Dies schlägt bei Basen größer als 36 fehl, da a toStringgeworfen wird RangeError. Große Basen sind eindeutig nicht sinnvoll, um sie als Zeichen darzustellen.
Anko
19

Ich bin zu diesem Beitrag gekommen und musste von Basis 10 auf 62 und umgekehrt konvertieren. Obwohl die Lösungen hier großartig sind parseIntund toStringnur Basis 2 bis 36 unterstützen. Wenn sich also jemand in einer ähnlichen Position befindet wie ich und Basis 2 bis 62 benötigt, habe ich meine Lösung unten eingefügt.

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';
}

Ryan Smith
quelle
Gibt es eine Variation für Schwimmer? Wie kann ich zB 1.3in Base 64 konvertieren ?
Cyoce
Ich habe mich nicht persönlich entschuldigt.
Ryan Smith
1
Sieht so aus, als gäbe es irgendwo einen Fehler. Das Konvertieren von "111222444abcdef" von Basis 16 auf 10 und zurück führt zu "111222444abcdf0"
Experte
Ich habe das Gefühl, dass dies möglicherweise etwas mit der Genauigkeit von dec_value % to_baseZahlen in JavaScript @expert zu tun hat, da der Fehler durch große Zahlen verursacht wird , aber ich kann ihn anscheinend nicht für kleinere Zahlen reproduzieren.
Ryan Smith
1
@ RyanSmith Sie haben Recht, andere Online- Konverter tun dies auch.
Benutzer, der kein Benutzer ist
9

Sie können den folgenden Code ausprobieren, der auch Zahlen mit beliebiger Genauigkeit unterstützt (größer als 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;
}

Verwendung:

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

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

Der Basiscode wurde gefunden, hier , ich habe ein bisschen es verbessert auch 64 bis Base bis zu unterstützen.

Slavik Meltser
quelle
1
Dies ist ein sehr guter Code! Wissen Sie, ob es eine C-Version davon gibt? Ich scheine es nicht zu finden!
Zibri
2
@ Zibri, sorry, IDK. Sie können es aber gerne selbst konvertieren und hier mit anderen teilen.
Slavik Meltser
8

Das folgende Diagramm könnte helfen. Beachten Sie, dass Sie zum Konvertieren von Basis 16 in Basis 2 zuerst in Basis 10 und dann in Basis 2 konvertieren müssen.

Basisumwandlung

Maria Ines Parnisari
quelle
8

Nun, ich habe eine Funktion erstellt, die von Basis 10 auf jede Basis übersetzt werden kann. (Dies hängt davon ab, wie viele Zeichenfolgen Sie im Array Ahaben. Wenn es mehr als das + 10 sind, gehen ihm die Symbole aus.) Und ich habe fast geweint, als ich herausfand, dass Sie es mit weniger als 10 Zeichen schaffen könnten. .

Fügen Sie ein Lesezeichen hinzu und fügen Sie es als URL ein ... Ich habe es auf lange, aber persönliche Weise gemacht. Zumindest kann meine eine Basis verwenden, die höher als 36 ist. Sie können selbst mehr Symbole hinzufügen, aber wenn Sie möchten, kann ich es für Sie machen ...

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

ScienzaM
quelle
Ich denke, Sie haben irgendwo einen Zählfehler. 100.toString (26) = "3M", aber Ihr wird "3O" ausgeben (drei oh, nicht drei null)
oooyaya
Dies führt nicht zu negativen Zahlen. Versuchen Sie, -1zur Basis zu konvertieren 10.
Benutzer, der kein Benutzer ist
Verwenden Sie "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /" und Sie können zu base64 (dem echten, um nicht mit btoa / atob zu verwechseln)
Zibri
@oooyaya Eigentlich gibt es "2S" aus, die richtige Antwort. Übrigens, benutze var x = 100; x.toString (26);
Benutzer, der kein Benutzer ist
8

Geben Sie den Radix an, den Sie als Parameter verwenden möchten.

HINWEIS: Dies funktioniert nur zum Konvertieren von Basen 2-36 in Dezimal- und kleine Werte.

parseInt(string, radix) 

parseInt("80", 10) // results in 80
parseInt("80", 16) // results in 128
// etc

Über „kleine“, parseInt("6f", 32)ist in Ordnung (= 207),
aber auch jede andere etwas größer wird auch 207 6f1, 6f11...

Russ Cam
quelle
@Nosredna du bist richtig, aber Russ Cam hat die richtige Syntax für mich parseInt - das ist mehr als genug. Vielen Dank.
Yves
3
@RussCam Ich habe nicht abgelehnt, aber ich denke, das liegt daran, dass diese Antwort auf die Konvertierung in eine Dezimalzahl beschränkt ist, die das angegebene Beispiel anspricht, aber die Frage war between different bases. (Ich habe keinen Zweifel, das hat Sie in diesen sechs Jahren
nervt
5

Normalerweise benutze ich diese Funktion, um von verschiedenen Basen zu konvertieren.

Beispielsweise wird "11111111" für beide Fälle zurückgegeben: convertBase ("ff", 16, 2) oder 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)
    };
}
punov
quelle
5

Diese Funktion generiert eine Dezimalzahl für jede Basis von 2 bis 36. (wie bei Javascript)

Sie können die Basis jedoch um mehr als 36 erhöhen, indem Sie einfach ein neues Zeichen in keys[]Kleinbuchstaben ["a", "b"] hinzufügen.

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)) 

Nur
quelle
3

Ich habe eine Funktion zum Konvertieren einer JavaScript-Zeichenfolge von einer Basis in eine andere Basis geschrieben, wobei die ursprüngliche Basis und die neue Basis als Parameter angegeben wurden.

function convertFromBaseToBase(str, fromBase, toBase){
	var num = parseInt(str, fromBase);
    return num.toString(toBase);
}

alert(convertFromBaseToBase(10, 2, 10));

Anderson Green
quelle
Ja, das ist der richtige Weg!
Ansjovis86
2

Verwenden der parseInt- Funktion:

var noInBase10 = parseInt('8F',16);
Mike Dinescu
quelle
1

Überprüfen Sie den vollständigen JS-Code , um ihn in eine andere Basis zu konvertieren

/**

* Konvertieren von / nach Binär / Dezimal / Hexadezimal in JavaScript * https://gist.github.com/shamshul2007/ * Copyright 2012-2015, Shamshul * Lizenziert unter der MIT-Lizenz * http://www.opensource.org/licenses / mit-Lizenz * /

(Funktion(){

var ConvertBase = function (num) {
    return {
        from : function (baseFrom) {
            return {
                to : function (baseTo) {
                    return parseInt(num, baseFrom).toString(baseTo);
                }
            };
        }
    };
};

// binary to decimal
ConvertBase.bin2dec = function (num) {
    return ConvertBase(num).from(2).to(10);
};

// binary to hexadecimal
ConvertBase.bin2hex = function (num) {
    return ConvertBase(num).from(2).to(16);
};

// decimal to binary
ConvertBase.dec2bin = function (num) {
    return ConvertBase(num).from(10).to(2);
};

// decimal to hexadecimal
ConvertBase.dec2hex = function (num) {
    return ConvertBase(num).from(10).to(16);
};

// hexadecimal to binary
ConvertBase.hex2bin = function (num) {
    return ConvertBase(num).from(16).to(2);
};

// hexadecimal to decimal
ConvertBase.hex2dec = function (num) {
    return ConvertBase(num).from(16).to(10);
};
//Octal to Decimal
ConvertBase.oct2dec = function (num) {
    return ConvertBase(num).from(8).to(10);
};

 //Decimal to Octal
ConvertBase.dec2oct = function (num) {
    return ConvertBase(num).from(10).to(8);
};

this.ConvertBase = ConvertBase;

})(Dies);

/ * * Verwendungsbeispiel: * ConvertBase.bin2dec ('1111'); // '15' * ConvertBase.dec2hex ('82 '); // '52' * ConvertBase.hex2bin ('e2'); // '11100010' * ConvertBase.dec2bin ('153'); // '10011001' * ConvertBase.hex2dec ('1FE4ED63D55FA51E'); // '2298222722903156000' * ConvertBase.oct2dec ('777'); // '511' * ConvertBase.dec2oct ('551'); // '1047' * /

shamshul2007
quelle
1

Sie können die in JavaScript integrierten Integer-Literale für einige Szenarien verwenden:

function binaryToDecimal(binaryString) {
    return Number('0b' + binaryString.replace('-', '')) * signOf(binaryString);;        
}

function octalToDecimal(octalString) {
    return Number('0o' + octalString.replace('-', '')) * signOf(octalString);
}

function hexToDecimal(hexString) {
    return Number('0x' + hexString.replace('-', '')) * signOf(hexString);
}

function signOf(n) {
  return n.trim()[0] == '-' ? -1 : 1;
}

console.log(binaryToDecimal('-0101'),
             octalToDecimal('-052171'),
               hexToDecimal('deadbeef'));

Mystisch
quelle
1

Versuchen Sie den folgenden Code, der aus Slavik Meltsers Beitrag optimiert wurde und BASE n- Konvertierungen mit allen Radix-Kombinationen zwischen Base2 und Base256 implementiert . Dieser Code akzeptiert drei Arten von Argumenten zum Definieren von Quell- und Zielnummernsystemen:

  • nach Zahlensystem Radix (zB 8)
  • nach Nummer Systemkonvention Name (zB 'Bitcoin')
  • durch Angabe von benutzerdefinierten Ziffern als Argument (z. B. ['0123456789ABCDEF'])

Sie werden sehen, dass einige Ziffern des Zahlensystems innerhalb der Klasse fest codiert wurden und standardmäßig verwendet werden, wenn Sie den Radix als Argument übergeben. (.eg 64) Wenn keine fest codierte Ziffer vorhanden ist (z. B. 16), werden Standardnummern für alle Radixe zwischen Base2 und Base256 zugewiesen, was im Selbsttest weiter unten sehr deutlich wird.

function BASE() {
  /**
   * BASE n converter doing all the radix combinations between Base2 and Base256
   * @param  {String}               str         input number
   * @param  {Number|String|Array}  fromBase    input number system radix (Number, e.g. 64), convention name (String, e.g. 'Bitcoin') or range (Array)
   * @param  {Number|String|Array}  toBASE      output number system radix (Number), convention name (String) or range (Array e.g. ['0123456789'])
   * @return {String}                           output number
   */
    this.convert = function (str, fromBase, toBASE)
    {
      if(typeof(fromBase)=='object') { this.fromSymbols = fromBase[0] } else this.fromSymbols = this.getsymbols(fromBase);
      if(typeof(toBASE)  =='object') { this.toSymbols = toBASE[0] } else this.toSymbols = this.getsymbols(toBASE);
      fromBase = this.fromSymbols.length; toBASE = this.toSymbols.length;

      // PARSE INPUT DIGITS ARRAY
      for(var _a = [0], str = str.split(''); str.length > 0 && _a[_a.push(this.fromSymbols.indexOf(str.pop())) - 1] >= 0;);
      var _d = _a.shift() + _a[_a.length-1]>=0 ? _a : null; if (_d === null) return null;

      // BASE CONVERSION
      for (var _n = 0,_a = [],_p = [1]; _n < _d.length; _n++) { _a = add(_a, mul(_d[_n], _p, toBASE), toBASE); _p = mul(fromBase, _p, toBASE) }

      // PARSE OUTPUT DIGITS ARRAY
      for (var _n = _a.length - 1, _o = ''; _n >= 0; _o += this.toSymbols[_a[_n--]]);
      return _o.length==0?this.toSymbols[0]:_o;
    }

    this.symbols = {
        32:function(){return this["base32hex"]},
        36:["[0-9][A-Z]"],
        45:function(){return this["qr-alnum"]},
        58:function(){return this["Bitcoin"]},
        64:["[A-Z][a-z][0-9]+/"],
        85:function(){return this["RFC 1924"]},
        91:["[A-Z][a-z][0-9]!#$%&()*+,./:;<=>?@[]^_`{|}~\""],
        94:["[!-~]"],
    "geohash":  ["[0-9][b-h]jkmn[p-z]"],                      // base 32
    "RFC 4648": ["[A-Z][2-7]"],                               // base 32
    "base32hex": ["[0-9][A-V]"],                              // base 32
    "qr-alnum":["[0-9][A-Z] $%*+-./:"],                       // base 45
    "Bitcoin":  ["[1-9][A-H]JKLMN[P-Z][a-k][m-z]"],           // base 58
    "RFC 1924": ["[0-9][A-Z][a-z]!#$%&()*+-;<=>?@^_`{|}~"]    // base 85
    }

    this.getsymbols = function(index) {
      if(typeof(this.symbols[index])=="undefined") this.symbols[index] = index<95?this.rng(index<64?"[0-9][A-Z][a-z]+":"[A-Z][a-z][0-9][!-/][:-@][[-`][{-~]").substring(0,index):this.rng("[\x00-\xff]").substring(256-index,256);
      if(typeof(this.symbols[index])=="function")  this.symbols[index] = this.symbols[index]();             // process references
      if(typeof(this.symbols[index])=="object")    this.symbols[index] = this.rng(this.symbols[index][0]);  // process range_replace
      return this.symbols[index];
    }

    this.rng = function(_s) {
      var _a = _s.match(/\[.-.\]/); if(_a==null) return _s; else { _a=[_a[0].charCodeAt(1),_a[0].charCodeAt(3)];
      return this.rng(_s.replace(RegExp("\\[(\\x"+("0"+_a[0].toString(16)).slice(-2)+"-\\x"+_a[1].toString(16)+")\\]","g")
      ,String.fromCharCode(..." ".repeat(_a[1]-_a[0]+1).split("").map((_e,_i)=>_i+_a[0])) )) }
    }

    this.selftest = function() {
      var _a={}; for(var _o in this.symbols) _a[_o] = this.getsymbols(_o).length; // built-in symbols
      for(_o=2;_o<=95;_o++) _a[_o] = this.getsymbols(_o).length; _a[256]=256;     // symbol range 2-95 + 256 (96-255 is similar)
      var _s = "",_a = Object.keys(_a).sort(function(a,b){return _a[a]-_a[b]});   // sort merged list
      for(var _i in _a) {                                                         // iterate number systems
        _o = {fromBase:10, toBASE:_a[_i]}; var _r = this.convert("",10,_o.toBASE)
        _s += "\r\n\oBASE.convert(n, '"+_o.fromBase+"', '"+_o.toBASE+"') ["+this.fromSymbols+"] ["+this.toSymbols+"]\r\n"
        for(var _n=0;_n<(this.fromSymbols.length+2);_n++) {                       // iterate numbers
          _r = this.convert(String(_n),_o.fromBase,_o.toBASE)
          _s += _n+(String(_n)==this.convert(_r,_o.toBASE,_o.fromBase)?">":"?")+"["+_r+"] ";
        }
      }
      return _s
    }

    var add = function(x, y, base) {
        var _m = Math.max(x.length, y.length);
        for(var _c = _n = 0,_r = []; _n < _m || _c; _c = Math.floor(_z / base)) {
          var _z = _c + (_n < x.length ? x[_n] : 0) + (_n < y.length ? y[_n] : 0);
          var _n =  _r.push(_z % base);
        }
        return _r;
    }

    var mul = function(x, pow, base) {
        for(var _r = x < 0 ? null : []; x > 0; x = x >> 1) {
          if(x & 1) _r = add(_r, pow, base);
          pow = add(pow, pow, base);
        }
        return _r;
    }
}

Verwendung:

// quick test, convert from base45 to base32, using custom symbols for base85 and back to base45

var oBASE = new BASE();

var n = "THIS IS A NUMBER";                 // Base 45 code = 'qr-alnum'
console.log(n);                             // Result: 'THIS IS A NUMBER'

var n = oBASE.convert(n,"qr-alnum",32);     // Base 45 to Base 32 = 'base32hex'
console.log(n);                             // Result: '4ONI84LCTLJ1U08G1N'

var s85 = oBASE.rng("[0-9][a-z][A-Z].-:+=^!/*?&<>()[]{}@%$#"); // 32/Z85 custom symbols
var n = oBASE.convert(n,"base32hex",[s85]); // 'base2hex' to custom Base 85 
console.log(n);                             // Result: 'fnaxrZP)?5d[DG'

var n = oBASE.convert(n,[s85],45);          // Custom Base 85 to Base 45 = 'qr-alnum'
console.log(n);                             // Result: 'THIS IS A NUMBER'

function BASE(){this.convert=function(o,r,n){this.fromSymbols="object"==typeof r?r[0]:this.getsymbols(r),this.toSymbols="object"==typeof n?n[0]:this.getsymbols(n),r=this.fromSymbols.length,n=this.toSymbols.length;var i=[0];for(o=o.split("");o.length>0&&i[i.push(this.fromSymbols.indexOf(o.pop()))-1]>=0;);var h=i.shift()+i[i.length-1]>=0?i:null;if(null===h)return null;for(var e=0,l=(i=[],[1]);e<h.length;e++)i=t(i,s(h[e],l,n),n),l=s(r,l,n);e=i.length-1;for(var m="";e>=0;m+=this.toSymbols[i[e--]]);return 0==m.length?this.toSymbols[0]:m},this.symbols={32:function(){return this.base32hex},36:["[0-9][A-Z]"],45:function(){return this["qr-alnum"]},58:function(){return this.Bitcoin},64:["[A-Z][a-z][0-9]+/"],85:function(){return this["RFC 1924"]},91:['[A-Z][a-z][0-9]!#$%&()*+,./:;<=>?@[]^_`{|}~"'],94:["[!-~]"],geohash:["[0-9][b-h]jkmn[p-z]"],"RFC 4648":["[A-Z][2-7]"],base32hex:["[0-9][A-V]"],"qr-alnum":["[0-9][A-Z] $%*+-./:"],Bitcoin:["[1-9][A-H]JKLMN[P-Z][a-k][m-z]"],"RFC 1924":["[0-9][A-Z][a-z]!#$%&()*+-;<=>?@^_`{|}~"]},this.getsymbols=function(t){return void 0===this.symbols[t]&&(this.symbols[t]=t<95?this.rng(t<64?"[0-9][A-Z][a-z]+":"[A-Z][a-z][0-9][!-/][:-@][[-`][{-~]").substring(0,t):this.rng("[\0-ÿ]").substring(256-t,256)),"function"==typeof this.symbols[t]&&(this.symbols[t]=this.symbols[t]()),"object"==typeof this.symbols[t]&&(this.symbols[t]=this.rng(this.symbols[t][0])),this.symbols[t]},this.rng=function(t){var s=t.match(/\[.-.\]/);return null==s?t:(s=[s[0].charCodeAt(1),s[0].charCodeAt(3)],this.rng(t.replace(RegExp("\\[(\\x"+("0"+s[0].toString(16)).slice(-2)+"-\\x"+s[1].toString(16)+")\\]","g"),String.fromCharCode(..." ".repeat(s[1]-s[0]+1).split("").map((t,o)=>o+s[0])))))},this.selftest=function(){var t={};for(var s in this.symbols)t[s]=this.getsymbols(s).length;for(s=2;s<=95;s++)t[s]=this.getsymbols(s).length;t[256]=256;var o="";t=Object.keys(t).sort(function(s,o){return t[s]-t[o]});for(var r in t){s={fromBase:10,toBASE:t[r]};var n=this.convert("",10,s.toBASE);o+="\r\noBASE.convert(n, '"+s.fromBase+"', '"+s.toBASE+"') ["+this.fromSymbols+"] ["+this.toSymbols+"]\r\n";for(var i=0;i<this.fromSymbols.length+2;i++)n=this.convert(String(i),s.fromBase,s.toBASE),o+=i+(String(i)==this.convert(n,s.toBASE,s.fromBase)?">":"?")+"["+n+"] "}return o};var t=function(t,s,o){for(var r=Math.max(t.length,s.length),n=e=0,i=[];e<r||n;n=Math.floor(h/o))var h=n+(e<t.length?t[e]:0)+(e<s.length?s[e]:0),e=i.push(h%o);return i},s=function(s,o,r){for(var n=s<0?null:[];s>0;s>>=1)1&s&&(n=t(n,o,r)),o=t(o,o,r);return n}}

Selbsttest:

// quick test, convert from base45 to base32, using custom symbols for base85 and back to base45

var oBASE = new BASE();
console.log(oBASE.selftest())  
  
function BASE(){this.convert=function(o,r,n){this.fromSymbols="object"==typeof r?r[0]:this.getsymbols(r),this.toSymbols="object"==typeof n?n[0]:this.getsymbols(n),r=this.fromSymbols.length,n=this.toSymbols.length;var i=[0];for(o=o.split("");o.length>0&&i[i.push(this.fromSymbols.indexOf(o.pop()))-1]>=0;);var h=i.shift()+i[i.length-1]>=0?i:null;if(null===h)return null;for(var e=0,l=(i=[],[1]);e<h.length;e++)i=t(i,s(h[e],l,n),n),l=s(r,l,n);e=i.length-1;for(var m="";e>=0;m+=this.toSymbols[i[e--]]);return 0==m.length?this.toSymbols[0]:m},this.symbols={32:function(){return this.base32hex},36:["[0-9][A-Z]"],45:function(){return this["qr-alnum"]},58:function(){return this.Bitcoin},64:["[A-Z][a-z][0-9]+/"],85:function(){return this["RFC 1924"]},91:['[A-Z][a-z][0-9]!#$%&()*+,./:;<=>?@[]^_`{|}~"'],94:["[!-~]"],geohash:["[0-9][b-h]jkmn[p-z]"],"RFC 4648":["[A-Z][2-7]"],base32hex:["[0-9][A-V]"],"qr-alnum":["[0-9][A-Z] $%*+-./:"],Bitcoin:["[1-9][A-H]JKLMN[P-Z][a-k][m-z]"],"RFC 1924":["[0-9][A-Z][a-z]!#$%&()*+-;<=>?@^_`{|}~"]},this.getsymbols=function(t){return void 0===this.symbols[t]&&(this.symbols[t]=t<95?this.rng(t<64?"[0-9][A-Z][a-z]+":"[A-Z][a-z][0-9][!-/][:-@][[-`][{-~]").substring(0,t):this.rng("[\0-ÿ]").substring(256-t,256)),"function"==typeof this.symbols[t]&&(this.symbols[t]=this.symbols[t]()),"object"==typeof this.symbols[t]&&(this.symbols[t]=this.rng(this.symbols[t][0])),this.symbols[t]},this.rng=function(t){var s=t.match(/\[.-.\]/);return null==s?t:(s=[s[0].charCodeAt(1),s[0].charCodeAt(3)],this.rng(t.replace(RegExp("\\[(\\x"+("0"+s[0].toString(16)).slice(-2)+"-\\x"+s[1].toString(16)+")\\]","g"),String.fromCharCode(..." ".repeat(s[1]-s[0]+1).split("").map((t,o)=>o+s[0])))))},this.selftest=function(){var t={};for(var s in this.symbols)t[s]=this.getsymbols(s).length;for(s=2;s<=95;s++)t[s]=this.getsymbols(s).length;t[256]=256;var o="";t=Object.keys(t).sort(function(s,o){return t[s]-t[o]});for(var r in t){s={fromBase:10,toBASE:t[r]};var n=this.convert("",10,s.toBASE);o+="\r\noBASE.convert(n, '"+s.fromBase+"', '"+s.toBASE+"') ["+this.fromSymbols+"] ["+this.toSymbols+"]\r\n";for(var i=0;i<this.fromSymbols.length+2;i++)n=this.convert(String(i),s.fromBase,s.toBASE),o+=i+(String(i)==this.convert(n,s.toBASE,s.fromBase)?">":"?")+"["+n+"] "}return o};var t=function(t,s,o){for(var r=Math.max(t.length,s.length),n=e=0,i=[];e<r||n;n=Math.floor(h/o))var h=n+(e<t.length?t[e]:0)+(e<s.length?s[e]:0),e=i.push(h%o);return i},s=function(s,o,r){for(var n=s<0?null:[];s>0;s>>=1)1&s&&(n=t(n,o,r)),o=t(o,o,r);return n}}

Shrimpy
quelle
0

Sie können Zahlen auch hexadezimal in dezimal wie folgt konvertieren:

var a="8F";
var b=a.split("");
var result=0;var hex_multiplier=1;
for(var i=0;i<b.length;i++){
    result +=parseInt(b[i],16)*hex_multiplier;
    hex_multiplier *=16;
}
console.log(result);

Hier können Sie a mit einer beliebigen Hexadezimalzahl ändern und das Ergebnis in Dezimalform erhalten.


quelle
0

Konvertieren von Zahlen in verschiedene Basen in JavaScript oder Typoskript auf folgende Weise.

function binary(number) {
    console.log((number >>> 0).toString(2));   //base 2 for binary
}
binary(-7);

function octal(number) {
    console.log(number.toString(8));   //base 8 for octal
}
octal(15);

function hex(number) {
    console.log(number.toString(16));   //base 16 for hex
}
hex(15);

Hier in der Binärfunktion können Sie die number.toString(2)Funktion verwenden, aber das Problem tritt auf, wenn negative Zahlen dargestellt werden. Damit können Sie unsigned right shift bitwise operator (>>>)dieses Problem mit dem beheben.

Bhavesh Ajani
quelle
-2

Ihre eigene Rekursionsmethode zum Erstellen von base2-Konvertierungen.

Wie von den oben genannten Benutzern erwähnt, let n = 13; console.log(n.toString(2));wird 13 von Basis 10 zu Basis 2 konvertiert.

Aber für den Fall, dass Sie das gleiche programmieren möchten. Ich habe eine rekursive Methode geschrieben, um dasselbe zu tun. die einfach durch 2 teilen und dann die restlichen zählen.

// @author Tarandeep Singh :: Created recursive converter from base 10 to base 2 
// @date : 2017-04-11
// Convert Base 10 to Base 2, We should reverse the output 
// For Example base10to2(10) = "0101" just do res = base10to2(10).split('').reverse().join();
function base10to2(val, res = '') {
  if (val >= 2) {
    res += '' + val % 2;
    return base10to2(val = Math.floor(val / 2), res);
  } else {
    res += '' + 1
    return res;
  }
}

let n = 13;

var result = base10to2(n).split('').reverse().join();
document.write(`Converting ${n} into Base2 is ${result}`);

Tarandeep Singh
quelle