2016-04-01 12 views
0

Ich muss JavaScript-Strings mit hexadezimaler Kodierung zerlegen (verschleiern).Wie man JavaScript-Zeichenketten mit hexadezimalem Escape manipulieren kann?

Quellcode:

var a = 'a'; 

Mangled Code:

var a = '\x61'; 

Es ist leicht String in einen hexadezimalen Wert zu konvertieren:

var map = { 
    '\b': '\\b', 
    '\f': '\\f', 
    '\n': '\\n', 
    '\r': '\\r', 
    '\t': '\\t', 
}; 

var hex = function (str) { 
    var result = ''; 
    for (var i = 0, l = str.length; i < l; i++) { 
     var char = str[i]; 
     if (map[char]) { 
      result += map[char]; 
     } else if ('\\' == char) { 
      result += '\\' + str[++i]; 
     } else { 
      result += '\\x' + str.charCodeAt(i).toString(16); 
     } 
    } 
    return result; 
}; 

Aber wenn ich hinzufügen, diese Zeichenfolge an die Ausgabedatei bekomme ich:

var a = '\\x61'; 

P.S. Ich benutze esprima/escodegen/estraverse um mit AST zu arbeiten.

+0

Sehen Sie, wie die Saiten hier umgesetzt werden: http://stackoverflow.com/questions/21647928/javascript-unicode-string-to -hex –

+0

Hinweis '\ x ??' ist ein Ein-Byte-Zeichen, während '\ u ????' ein Unicode-Zeichen ist. Es ist wahrscheinlich sicherer, Letzteres zu verwenden. –

+0

Diese Version ist vielleicht näher an dem, was Sie brauchen: https://gist.github.com/mathiasbynens/1243213 –

Antwort

1

Unten ist ein Entwurf der Implementierung basiert auf Качалов Тимофей ‚s Lösung:

var esprima = require('esprima'); 
var estraverse = require('estraverse'); 
var escodegen = require('escodegen'); 

function stringToUnicode(string) { 
    return '"' + string.replace(/[\s\S]/g, function (escape) { 
     return '\\u' + ('0000' + escape.charCodeAt().toString(16)).slice(-4); 
    }) + '"'; 
} 

var tree = esprima.parse(code); 
//... 
estraverse.replace(tree, { 
    leave: function(node){ 
     if (node.type === 'Literal' && (node.raw[0] === '"' || node.raw[0] === '\'')){ 
      node['x-verbatim-property'] = { 
       content : stringToUnicode(node.value), 
       precedence: escodegen.Precedence.Primary 
      }; 
     } 
    } 
}); 
//... 
var result = escodegen.generate(tree, {verbatim: 'x-verbatim-property'});