2016-11-07 7 views
1

Ich habe eine Hexadezimalzahl unbekannter Länge und möchte sie in eine möglichst kurze Zeichenfolge umwandeln. Und später in der Lage sein, die neue Zeichenfolge wieder in die ursprüngliche Nummer zu konvertieren.Wie komprimiere ich eine Hexadezimalzahl in eine kurze Zeichenfolge?

Da jede Ziffer nur aus 4 Bits besteht, dachte ich daran, die Zahl in eine UFT-16- oder UFT-32-Zeichenfolge umzuwandeln. Das würde eine kurze Zeichenfolge mit merkwürdigen Zeichen erzeugen.

Hypothetisches Beispiel: 0x874FAB41900C -> "ÚΔЂ" -> 0x874FAB41900C.

Also, was ich suche ist zwei Javascript-Funktionen wie folgt aus:

function hexToString(hex) { 
    for (var i=0; i < hex.length; i++) { 
     // convert the digits into UFT-16 
    } 

    return string; 
} 

function stringToHex(string) { 
    for (var i=0; i < string.length; i++) { 
     // convert the char back into hex values 
    } 

    return hex; 
} 

Jede Idee, wie dies zu tun?

+0

Wenn Sie memor besorgt y Größe, Sie könnten ein Uint8Array – juvian

+1

verwenden Ich kümmere mich nicht um Speichergröße, ich brauche nur eine _short_ Zeichenfolge, die einfacher zu kopieren/Vergangenheit sein wird. – Thomas

Antwort

3

In js String-Zeichen verwenden 16 Bit, so dass wir 4 Hex-Zeichen in 1 packen kann:

function hexToString(hex) { 
 
    hex = hex.substring(2) // remove the '0x' part 
 
    var string = "" 
 

 
    while (hex.length % 4 != 0) { // we need it to be multiple of 4 
 
    hex = "0" + hex; 
 
    } 
 

 
    for (var i = 0; i < hex.length; i+= 4){ 
 
    string += String.fromCharCode(parseInt(hex.substring(i,i + 4), 16)) // get char from ascii code which goes from 0 to 65536 
 
    } 
 

 
    return string; 
 
} 
 

 
function stringToHex(string) { 
 
    var hex = "" 
 
    for (var i=0; i < string.length; i++) { 
 
    hex += ((i == 0 ? "" : "000") + string.charCodeAt(i).toString(16)).slice(-4) // get character ascii code and convert to hexa string, adding necessary 0s 
 
    } 
 

 
    return '0x' + hex.toUpperCase(); 
 
} 
 

 

 

 
var str = hexToString("0x874FAB41900C") 
 
console.log(str) 
 
console.log(stringToHex(str))

Wenn Sie eine 32-Bit-Version wollen, müssen Sie die Codierung Version ändern, die Decodieren bleibt gleich. Beachten Sie, dass es nur Unicode-Zeichen bis zu 21 Bits dont so denken Sie, als die 16-Bit besser machen kann, dieses won't wirklich machen es mit weniger Zeichen:

function hexToString(hex) { 
    hex = hex.substring(2) // remove the '0x' part 
    var string = "" 

    while (hex.length % 8 != 0) { // we need it to be multiple of 8 
    hex = "0" + hex; 
    } 

    for (var i = 0; i < hex.length; i+= 8){ 
    string += String.fromCharCode(parseInt(hex.substring(i,i + 4), 16), parseInt(hex.substring(i + 4,i + 8), 16)) 
    } 

    return string; 
} 

Sie können mehr über lesen die 32-Bit hier: how to render 32bit unicode characters in google v8 (and nodejs)

Edit: Ein Spaß Beispiel

function hexToString(hex) { 
 
    hex = hex.substring(2) // remove the '0x' part 
 
    var string = "" 
 

 
    while (hex.length % 8 != 0) { // we need it to be multiple of 8 
 
    hex = "0" + hex; 
 
    } 
 

 
    for (var i = 0; i < hex.length; i+= 8){ 
 
    string += String.fromCharCode(parseInt(hex.substring(i,i + 4), 16), parseInt(hex.substring(i + 4,i + 8), 16)) 
 
    } 
 

 
    return string; 
 
} 
 

 
console.log(hexToString("0xD83DDCA3"))

+1

Super, danke! Aber gibt es eine Möglichkeit, die Saite noch kürzer zu machen? Wie mit UFT-32? – Thomas

+0

@Thomas hinzugefügt 32-Bit-Version – juvian

+1

@Thomas hier ist eine 20-Bit-Version, die in der Tat die Menge der verwendeten Zeichen verringert, das ist das Beste, was Sie tun können: https://jsfiddle.net/11t7h8ho/ – juvian

Verwandte Themen