2016-11-07 466 views
1

我有一個未知長度的十六進制數字,我想將其轉換爲儘可能短的字符串。之後可以將新字符串轉換回原始數字。如何將一個十六進制數字壓縮成一個短字符串?

由於每個數字只有4位,所以我在考慮將數字轉換爲UFT-16或UFT-32字符串。這將創建一個帶有怪異字符的短字符串。

假設的例子:0x874FAB41900C - >「??」 - > 0x874FAB41900C。

所以,我正在尋找的是兩個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; 
} 

任何想法如何做到這一點?

+0

如果你擔心MEMOR y的大小,你可以使用Uint8Array – juvian

+1

我不在乎內存大小,我只需要一個_short_字符串,它會更容易複製/過去。 – Thomas

回答

3

在JS字符串中的字符使用16位的,所以我們可以在1包4個十六進制字符:

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位版本,你需要更改編碼的版本,解碼保持不變。需要注意的是,只有Unicode字符多達21位以鴕鳥政策認爲你可以做得比16位的更好,這一個不需額外真的更少的字符使其:

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

你可以閱讀更多關於32位在這裏:how to render 32bit unicode characters in google v8 (and nodejs)

編輯:一個有趣的例子

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