如何解码XMLHttpRequest中的HEX?

时间:2013-09-12 17:39:02

标签: javascript ajax web xmlhttprequest

我有一个网站,我使用AJAX。我遇到了一些问题。

服务器返回类似于此{a:"x48\x65\x6C\x6C\x6F"}的JSON字符串。

然后在xx.responseText中,我们有了这个字符串'{a:"\x48\x65\x6C\x6C\x6F"}'

但是,如果我创建JavaScript字符串"\x48\x65\x6C\x6C\x6F",那么我有"Hello"而不是HEX!

是否可以从HEX获取xx.responseText“真实”文本(自动,没有.replace())?

2 个答案:

答案 0 :(得分:2)

如果输出完全常规(可预测),.replace()可能是最简单的。

var escapeSequences = xx.responseText.replace(/^\{a:/, '').replace(/\}$/, '');

console.log(escapeSequences === "\"\\x48\\x65\\x6C\\x6C\\x6F\""); // true

或者,如果字符串文字的值相等但可能不相同,则可以解析(见下文),然后stringify()个别属性。

console.log(JSON.stringify(data.a) === "\"Hello\""); // true

否则,您可能需要通过lexer运行responseText来对其进行标记并从中检索文字。 JavaScript不包含与解析/评估分开的选项,因此您需要为此找到一个库。

Lexer written in JavaScript?”可能是一个很好的起点。


解析它:

由于它似乎是一串代码,因此您可能必须使用eval()

var data = eval('(' + xx.responseText + ')');

console.log(data.a); // Hello

注意:括号中请确保将{...}评估为Object literal而不是block


此外,我建议寻找代码来替代这样的数据。

常见选项是JSON,它从JavaScript获取其语法,但使用了相当严格的子集。它不允许包含function或其他可能存在问题的代码。

var data = JSON.parse(xx.responseText);

console.log(data.a); // Hello

访问JSON.org,你应该能够找到一个参考或库来选择服务器端语言来输出JSON。

{ "a": "Hello" }

答案 1 :(得分:1)

为什么不让JSON解析器完成它的工作并处理\x转义序列,然后再将字符串转换回十六进制,例如。

function charToHex(c) {
    var hex = c.charCodeAt(0).toString(16);
    return (hex.length === 2) ? hex : '0' + hex;
}

"Hello".replace(/./g, charToHex);  // gives "48656c6c6f"