在JavaScript/NodeJS中压缩十六进制字符串
Compressing a Hex String in JavaScript/NodeJS
我的应用程序生成链接,其中包含十六进制字符串,如:37c1fbcabbc31f2f8d2ad31ceb91cd8d0d189ca5963dc6d353188d3d5e75b8b3e401d4e74e9b3e02efbff0792cda5c4620cb3b1f84aeb47b8d2225cd40e761a5
。我真的很想缩短它们,就像Ruby在Ruby/Rails中压缩十六进制字符串中提到的解决方案一样。
有没有一种方法可以在JavaScript/NodeJS中做到这一点?
node 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'
您可以使用toString和parseInt方法,它们基本上与您在链接中提到的方法相同:
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,因此您需要手动实现个人注释(我相信已经有一些实现了)。
最简单、最快的方法是定义一组64个安全字符用于URL,如a-Z、a-Z、0-9、_和$。然后将每三个十六进制数字(每个4位)编码为两个安全字符(每个6位)。这不需要乘法和除法,它可以用于任意长的字符串。
您需要在字符串末尾选择第65个字符来指示是否使用了最后一个四位部分。否则,对于包含偶数个字符的字符串,将产生歧义。让我们称之为2n。然后有3n-1或3n十六进制数字编码在其中,但无法判断是哪一个。您可以在序列后面添加一个特殊字符来指示其中一种情况。例如,一个"."(期间)。
注意:这里为该集选择的最后几个字符与Base64编码不同,因为URL有自己的安全标点符号定义。参见RFC 1738。
- 文本框应该只允许十六进制值
- 正在将unicode转换为十六进制
- 在js中将字符串转换为十六进制
- 如何在JavaScript中将数字表示为十六进制
- 带有 TCP/IP 通信的 JavaScript 十六进制代码
- 用Javascript正则表达式过滤十六进制数字
- 如何创建和递增2或3位十六进制数字
- 将html代码转换为十六进制
- 如何检查十六进制颜色是否为“”;太黑”;
- 将十六进制字符串转换为字节数组
- 解码十六进制编码/混淆的javascript
- 如何在HTML5 / javascript中查找十六进制值的特定位或数字
- 节点.js从 UTF8 文件创建十六进制缓冲区
- 从引导程序图标十六进制值输出一个符号
- 将Hsl转换为rgb和十六进制
- javascript:搜索并用不同的颜色代码替换十六进制颜色代码
- JavaScript 中两个十六进制字符串的 XOR
- 在JavaScript/NodeJS中压缩十六进制字符串
- 无需Javascript内置函数即可将十进制转换为十六进制
- 如何将十六进制数压缩成短字符串