在JavaScript / NodeJS中压缩hexstring

我的应用程序生成链接,其中包含hexstring,如: 37c1fbcabbc31f2f8d2ad31ceb91cd8d0d189ca5963dc6d353188d3d5e75b8b3e401d4e74e9b3e02efbff0792cda5c4620cb3b1f84aeb47b8d2225cd40e761a5 。 我真的希望缩短它们,比如在Ruby / Rails中压缩hexstring的Ruby解决scheme。

有没有办法在JavaScript / NodeJS做到这一点?

节点int编码器使用已经提到的策略来做到这一点。

它也支持大量的

 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' 

你可以使用toString和parseInt方法,基本上是做你在链接中提到的方法相同的东西:

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

把它转换回来,你只需要做相反的事情:

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

你的string唯一的问题是,这太大了,不能像JavaScript中的数字一样威胁。 你应该把它们分成大块。 JavaScript的数字精确到2 ^ 53(加号),因此您可以处理的最大正数为0x20000000000000(hex,即十进制为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); 

更新:你也可以使用base 62而不是36来压缩更多,但是注意到JS支持最多36 base,所以你需要手动实现这个个人符号 (我相信已经有一些实现了)。

最简单和最快速的事情是定义一个64位的安全字符,用于URL中,如AZ,az,0-9,_和$。 然后将每三个hex数字(每个4位)编码为两个安全字符(每个6位)。 这不需要乘法和除法,并且可以在任意长的string上使用。

您将需要select第65个字符在string的末尾使用,以指示是否使用最后一个四位块。 否则,对于包含偶数个字符的string将会产生歧义。 我们称之为2n 。 然后有3n-13nhex数字编码,但没有办法告诉哪个。 您可以按照具有特殊字符的顺序来指示其中的一种情况。 例如一个'。' (期)。

注意:这里select的最后几个字符与Base64编码不同,因为URL有自己的安全标点符号定义。 请参阅RFC 1738 。