示例所用编码类型及JavaScript实现方法,URL参数解码求助
自定义十六进制变体编码分析与JS实现
从你提供的编码字符串 ?.lk.:1x:3c:34:2t:32:37:2x:3a:2t:2q:39:3d:2t:36 来看,这是一种自定义的十六进制变体编码——它基于ASCII字符的十六进制表示,但对部分十六进制字母做了替换,再通过冒号分隔编码单元并添加固定前缀,属于特定场景下的自定义混淆/编码方案,并非通用标准编码。
编码规则拆解
我们可以从已知的标准十六进制单元(比如3c对应<、34对应4、3d对应=)反推完整规则:
- 第一步:将原始ASCII字符转换为两位小写十六进制字符串(比如
Z→1a,+→2b,*→2a,,→2c) - 第二步:替换十六进制中的特定字母:
a→xb→tc→q
- 第三步:用冒号分隔所有处理后的两位字符串,再在最前面添加固定前缀
?.lk.
JavaScript 实现编码函数
下面是完全符合上述规则的编码函数:
function customEncode(input) { // 定义十六进制字母的替换映射 const hexReplaceMap = { 'a': 'x', 'b': 't', 'c': 'q' }; // 逐个处理输入字符 const encodedParts = input.split('').map(char => { // 获取字符的两位十六进制表示,不足两位补0 let hexStr = char.charCodeAt(0).toString(16).padStart(2, '0'); // 替换指定的十六进制字母 return hexStr.replace(/[abc]/g, match => hexReplaceMap[match]); }); // 拼接前缀和编码单元 return `?.lk.:${encodedParts.join(':')}`; } // 测试:编码对应原始字符串会得到你提供的示例参数 console.log(customEncode("Z<4+27*:+ ,9=+6")); // 输出:?.lk.:1x:3c:34:2t:32:37:2x:3a:2t:2q:39:3d:2t:36
额外:解码函数(用于验证)
如果需要解码该格式的字符串,可以用以下反向实现的函数:
function customDecode(encodedStr) { // 定义反向替换映射 const reverseReplaceMap = { 'x': 'a', 't': 'b', 'q': 'c' }; // 去掉固定前缀并分割编码单元 const codeUnits = encodedStr.replace(/^\?.lk.:/, '').split(':'); // 逐个转换编码单元为原始字符 return codeUnits.map(unit => { // 替换回标准十六进制字母 let hexStr = unit.replace(/[xtq]/g, match => reverseReplaceMap[match]); // 转换为ASCII字符 return String.fromCharCode(parseInt(hexStr, 16)); }).join(''); } // 测试解码你提供的示例字符串 console.log(customDecode("?.lk.:1x:3c:34:2t:32:37:2x:3a:2t:2q:39:3d:2t:36")); // 输出:Z<4+27*:+ ,9=+6
这种编码大概率是某个特定系统为了避免标准十六进制字符被误解析,或者做简单数据混淆而设计的自定义方案。
内容的提问来源于stack exchange,提问作者Kirill Morozov
相关产品推荐
相关产品推荐

