2012-11-20 9 views
5

Ich habe einen vorzeichenbehafteten Wert als Hexadezimalzahl angegeben, z. B. 0xffeb und möchte es in -21 als eine "normale" Javascript-Ganzzahl konvertieren.Javascript: Konvertieren einer (hex) signierten Ganzzahl in einen JavaScript-Wert

ich einige Code geschrieben haben bisher:

function toBinary(a) { //: String 
    var r = ''; 
    var binCounter = 0; 
    while (a > 0) { 
     r = a%2 + r; 
     a = Math.floor(a/2); 
    } 
    return r; 
} 

function twoscompl(a) { //: int 
    var l = toBinaryFill(a).length; 
    var msb = a >>> (l-1); 

    if (msb == 0) { 
     return a; 
    } 

    a = a-1; 
    var str = toBinary(a); 
    var nstr = ''; 
    for (var i = 0; i < str.length; i++) { 
     nstr += str.charAt(i) == '1' ? '0' : '1'; 
    } 
    return (-1)*parseInt(nstr); 
} 

Das Problem ist, dass meine Funktion 1 als MSB gibt für beide Zahlen, da nur am MSB der Binärdarstellung „string“ betrachtet wird. Und für diesen Fall beide Zahlen sind 1:

-21 => 0xffeb => 1111 1111 1110 1011 
21 => 0x15 =>    1 0101 

Haben Sie eine Ahnung dieses effizienter und schöner zu implementieren?

Grüße, mythbu

Antwort

10

Verwenden parseInt() zu konvertieren (die Ihr Hex-String akzeptiert nur):

parseInt(a); 

Dann eine Maske verwendet werden, wenn das MSB, um herauszufinden, festgelegt ist:

a & 0x8000 

Wenn das einen Wert ungleich null zurückgibt, wissen Sie, dass es negativ ist.

Um es zu wickeln auf den Punkt:

a = "0xffeb"; 
a = parseInt(a, 16); 
if ((a & 0x8000) > 0) { 
    a = a - 0x10000; 
} 

Beachten Sie, dass dies nur funktioniert, für 16-Bit-Integer (short in C). Wenn Sie eine 32-Bit-Ganzzahl haben, benötigen Sie eine andere Maske und Subtraktion.

+2

sollten Sie minus '0x10000' – xiaoyi

+0

@xiaoyi Sie haben Recht, repariert es. –

+0

Nicht sicher, wie wichtig es ist, aber da Sie mit hex mit 'parseInt' arbeiten, möchten Sie wahrscheinlich' parseInt (a, 16) ' – Ian

8

kam ich mit dieser

function hexToInt(hex) { 
    if (hex.length % 2 != 0) { 
     hex = "0" + hex; 
    } 
    var num = parseInt(hex, 16); 
    var maxVal = Math.pow(2, hex.length/2 * 8); 
    if (num > maxVal/2 - 1) { 
     num = num - maxVal 
    } 
    return num; 
} 

und Nutzung bis:

var res = hexToInt("FF"); // -1 
res = hexToInt("A"); // same as "0A", 10 
res = hexToInt("FFF"); // same as "0FFF", 4095 
res = hexToInt("FFFF"); // -1 

Also im Grunde der Bereich des Hex-Konvertierung hängt Länge auf hex, Ameise das ist, was ich suchte. Ich hoffe es hilft.

Verwandte Themen