2012-08-02 182 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