2016-11-07 5 views
1

私は未知の長さの16進数を持っています。私はできるだけ短い文字列に変換したいと思います。そして、後で新しい文字列を元の番号に戻すことができます。16進数を短い文字列に圧縮する方法は?

各桁は4ビットしかないので、私はその数値をUFT-16またはUFT-32文字列に変換することを考えていました。それは奇妙な文字で短い文字列を作成します。

仮説例:0x874FAB41900C - > "ÚΔЂ" - > 0x874FAB41900C。

それでは、私が探していることは、このような2つのJavaScriptの関数である:

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

これを行うにはどのように任意のアイデア?私たちは1で4進文字をパックすることができますので、jsの文字列の文字は、16ビットを使用して

+0

あなたはUint8Arrayを使うことができます。 – juvian

+1

私はメモリサイズについて気にしません、私はちょうど_short_文字列が必要です。 – Thomas

答えて

3

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

あなたはエンコードのバージョンを変更する必要がある32ビット版をしたい場合は、デコードはそのままです。

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

あなたが詳細を読むことができます:この1 won'tが本当に少ない文字でそれを作るので、あなたは、16ビットのものよりも優れて行うことができると思うドント21ビットまでの唯一のUnicode文字があることに注意してくださいここでは32ビット:how to render 32bit unicode characters in google v8 (and nodejs)

編集:あなたはMEMORを心配している場合に楽しい一例

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

恐ろしい、ありがとう!しかし、文字列をさらに短くする方法はありますか? UFT-32のように? – Thomas

+0

@Thomasは32ビット版を追加しました – juvian

+1

@Thomasはここでは20ビット版ですが、実際に使用する文字数が少なくなります。これはあなたができる最高の方法です:https://jsfiddle.net/11t7h8ho/ – juvian

関連する問題