Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript/NodeJS中压缩十六进制字符串_Javascript_Node.js_Compression_Hex - Fatal编程技术网

在JavaScript/NodeJS中压缩十六进制字符串

在JavaScript/NodeJS中压缩十六进制字符串,javascript,node.js,compression,hex,Javascript,Node.js,Compression,Hex,我的应用程序生成包含以下十六进制字符串的链接:37C1FBCABBC31F2F8D2AD31CEB91CD8D0D189CA5963DC6D353188D3D5E75B8B3E401D4E74E9B3E02EFBF0792CDA5C4620CB3B3B1F84AEB47B8D2225CD40E761A5。我真的很想把它们缩短,就像中提到的Ruby解决方案一样 在JavaScript/NodeJS中有没有一种方法可以做到这一点?您可以使用和方法,这与您在链接中提到的方法基本相同: var hexS

我的应用程序生成包含以下十六进制字符串的链接:
37C1FBCABBC31F2F8D2AD31CEB91CD8D0D189CA5963DC6D353188D3D5E75B8B3E401D4E74E9B3E02EFBF0792CDA5C4620CB3B3B1F84AEB47B8D2225CD40E761A5
。我真的很想把它们缩短,就像中提到的Ruby解决方案一样

在JavaScript/NodeJS中有没有一种方法可以做到这一点?

您可以使用和方法,这与您在链接中提到的方法基本相同:

var hexString = "4b3fc1400";
var b36 = parseInt(hexString, 16).toString(36); // "9a29mgw"
要将其转换回,只需执行相反的操作:

hexString = parseInt(b36, 36).toString(16); // "4b3fc1400"
字符串的唯一问题是,它太大了,无法作为JavaScript中的数字使用。你应该把它们分成几块。JavaScript的数字精确到2^53(加号),因此您可以处理的最大正数是0x2000000000(十六进制,即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);
var hexString=“37C1FBCABBC31F2F8D2AD31CEB91CD8D0D189CA5963DC6D353188D3D5E75B8B3E401D4E74E9B3E02EFFF0792CDA5C4620CB3B3B1F84AEB47B8D2225CD40E761A5”
var b36=“”,b16=“”;
var-chunk,intChunk;
//14是0x2000000000的长度(基数16中的2^53)
对于(变量i=0,最大值=14;i

更新:您也可以使用base 62而不是36来压缩更多内容,但请注意,JS最多支持base 36,因此您需要手动实现(我相信已经有一些实现了)。

最简单、最快的方法是定义一组64个安全字符,以便在URL中使用,例如a-Z、a-Z、,0-9、0和0美元。然后将每三个十六进制数字(每个4位)编码为两个安全字符(每个6位)。这不需要乘法和除法,并且可以在任意长的字符串上使用

您需要在字符串末尾选择第65个字符,以指示是否使用了最后四位片段。否则,对于字符数为偶数的字符串,将产生歧义。我们称之为2n。然后有3n-1或3n个十六进制数字编码在其中,但没有办法分辨哪个。您可以在序列后面使用一个特殊字符来指示其中一种情况。例如“a”。(句号)

注意:此处为集合选择的最后几个字符与Base64编码不同,因为URL有自己的安全标点符号定义。请参阅。

节点使用前面提到的策略执行此操作

它还支持大量数据

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'

如何将字符串转换为base36,需要它来学习reddit的api,其中全名是t2_36basesencodedHere