2012-08-02 184 views

回答

1

節點int-encoder這樣做,使用已經提到的策略。

它也支持大量

npm install int-encoder 

var en = require('int-encoder'); 

//simple integer conversion 
en.encode(12345678); // "ZXP0" 
en.decode('ZXP0'); // 12345678 

//convert big hex number using optional base argument 
en.encode('e6c6b53d3c8160b22dad35a0f705ec09', 16); // 'hbDcW9aE89tzLYjDgyzajJ' 
en.decode('hbDcW9aE89tzLYjDgyzajJ', 16); // 'e6c6b53d3c8160b22dad35a0f705ec09' 
3

你可以使用toStringparseInt方法,基本上都在做的,你在鏈接中提到的方法,同樣的事情:

var hexString = "4b3fc1400"; 
var b36 = parseInt(hexString, 16).toString(36); // "9a29mgw" 

並把它轉換回來,你只需要做相反:

hexString = parseInt(b36, 36).toString(16); // "4b3fc1400" 

你的字符串唯一的問題是,它太大了,不能像JavaScript中的數字一樣威脅。你應該把它們分成大塊。 JavaScript的數字精確到2^53(加號),因此您可以處理的最大正數爲0x20000000000000(十六進制,即十進制爲9007199254740992);您可以使用精確度來處理該塊:

var hexString = "37c1fbcabbc31f2f8d2ad31ceb91cd8d0d189ca5963dc6d353188d3d5e75b8b3e401d4e74e9b3e02efbff0792cda5c4620cb3b1f84aeb47b8d2225cd40e761a5" 

var b36 = "", b16 = ""; 

var chunk, intChunk; 

// 14 is the length of 0x20000000000000 (2^53 in base 16) 

for (var i = 0, max = 14; i < hexString.length; i += max) { 
    chunk = hexString.substr(i, max); 
    intChunk = parseInt(chunk, 16); 

    if (intChunk.toString(16) !== chunk) { 
     intChunk = parseInt(hexString.substr(i, max - 1), 16); 
     i -= 1; 
    } 

    b36 += intChunk.toString(36) 
} 

// 11 is the length of 2gosa7pa2gv (2^53 in base 36) 

for (var i = 0, max = 11; i < b36.length; i += max) { 
    chunk = b36.substr(i, max); 
    intChunk = parseInt(chunk, 36); 

    if (intChunk.toString(36) !== chunk) { 
     intChunk = parseInt(b36.substr(i, max - 1), 36); 
     i -= 1; 
    } 

    b16 += intChunk.toString(16) 
} 

console.log(hexString); 
console.log(b36); 
console.log(b16); 

更新:您還可以使用基本的62,而不是36就壓縮更多的,但是請注意,JS支持高達基底36,所以你需要實現那personal notation手動(我相信已經有一些實現了)。

+0

如何從字符串轉換爲base36,需要它試圖在那裏的全名是可以學到一些東西reddit的的API t2_36basesencodedHere http://www.reddit.com/dev/API#fullnames – 2015-02-14 04:37:42

2

要做的最簡單和最快的事情是定義一組64個安全字符以供在URL中使用,例如A-Z,a-z,0-9,_和$。然後將每三個十六進制數字(每個4位)編碼爲兩個安全字符(每個6位)。這不需要乘法和除法,並且可以在任意長的字符串上使用。

您需要選擇第65個字符才能在字符串末尾使用,以指示是否使用最後一個四位塊。否則,對於包含偶數個字符的字符串,將會產生歧義。我們稱之爲2n。然後有3n-13n十六進制數字內編碼,但沒有辦法告訴哪個。您可以按照具有特殊字符的順序來指示其中的一種情況。例如。一個 '。' (期)。

注意:這裏選擇的最後幾個字符與Base64編碼不同,因爲URL有自己的安全標點符號定義。見RFC 1738