首页 > 解决方案 > 如何编码 Javascript

问题描述

如何解码从: \x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28313\x29 到: javascript:alert(313)

有谁知道编码,请指导我,我将非常感谢你!

谢谢!

标签: javascript

解决方案


您可以编写一个简单的解析器,将 Unicode 代码点转换为等效字符。

const main = () => {
  const convertBtn = document.querySelector('.convert');
  convertBtn.addEventListener('click', onConvert);
  triggerEvent(convertBtn, 'click');
};

const onConvert = e => {
  const input = document.querySelector('.input');
  const output = document.querySelector('.output');
  output.value = parseUnicodeString(input.value);
};

const parseUnicodeString = unicodeSring => {
  let result = '', buffer = null;
  for (let i = 0; i < unicodeSring.length; i++) {
    if (unicodeSring[i] === 'x') {
      buffer = '';
    } else if (/[0-9a-f]/.test(unicodeSring[i])) {
      if (buffer != null) {
        if (buffer.length === 1) {
          result += parseCodePoint(buffer + unicodeSring[i]);
          buffer = null;
        } else {
          buffer += unicodeSring[i];
        }
      } else {
        result += unicodeSring[i];
      }
    }
  }
  if (buffer != null && buffer.length > 0) {
    result += parseCodePoint(buffer);
  }
  return result;
}

const parseCodePoint = codePoint =>
  String.fromCodePoint(parseInt(codePoint, 16));

const triggerEvent = (el, eventName, data) => {
  let event;
  if (window.CustomEvent && typeof window.CustomEvent === 'function') {
    event = new CustomEvent(eventName, {detail: data});
  } else {
    event = document.createEvent('CustomEvent');
    event.initCustomEvent(eventName, true, true, data);
  }
  el.dispatchEvent(event);
};

main();
body,html{width:100%;height:100%;margin:0;padding:0;background:#000;color:#fff}body{display:flex;flex-direction:column}button{background:#c46;border:thin solid #d26;color:#eee;padding:.125em;font-weight:700;cursor:pointer}button:hover{background:#f47;color:#fff}textarea{flex:1;background:#222;color:#eee;resize:none;border:none;outline:0;padding:.25em}
<textarea class="input">\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28313\x29</textarea>
<button class="convert">Convert</button>
<textarea class="output">
</textarea>

如果结合String.prototype.replace正则表达式,您可以将上面的逻辑简单地变成一条线。

const main = () => {
  const convertBtn = document.querySelector('.convert');
  convertBtn.addEventListener('click', onConvert);
  triggerEvent(convertBtn, 'click');
};

const onConvert = e => {
  const input = document.querySelector('.input');
  const output = document.querySelector('.output');
  output.value = parseUnicodeString(input.value);
};

const parseUnicodeString = unicodeSring =>
  unicodeSring.replace(/\\x([0-9a-f]{2})/ig, (match, codePoint) =>
    String.fromCodePoint(parseInt(codePoint, 16)));
    
const triggerEvent = (el, eventName, data) => {
  let event;
  if (window.CustomEvent && typeof window.CustomEvent === 'function') {
    event = new CustomEvent(eventName, {detail: data});
  } else {
    event = document.createEvent('CustomEvent');
    event.initCustomEvent(eventName, true, true, data);
  }
  el.dispatchEvent(event);
};

main();
body,html{width:100%;height:100%;margin:0;padding:0;background:#000;color:#fff}body{display:flex;flex-direction:column}button{background:#c46;border:thin solid #d26;color:#eee;padding:.125em;font-weight:700;cursor:pointer}button:hover{background:#f47;color:#fff}textarea{flex:1;background:#222;color:#eee;resize:none;border:none;outline:0;padding:.25em}
<textarea class="input">\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28313\x29</textarea>
<button class="convert">Convert</button>
<textarea class="output">
</textarea>


推荐阅读