【问题标题】:How decode HEX in XMLHtppRequest?如何在 XMLHttpRequest 中解码 HEX?
【发布时间】:2013-09-17 05:30:09
【问题描述】:

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

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

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

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

是否有可能从十六进制中获取xx.responseText“真实”文本(自动,没有.replace())?

【问题讨论】:

标签: javascript ajax web xmlhttprequest


【解决方案1】:

如果输出完全常规(可预测),.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,但使用了一个相当严格的子集。它不允许包含functions 或其他可能有问题的代码。

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

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

访问JSON.org,您应该可以找到参考或库,用于选择服务器端语言以输出 JSON。

{ "a": "Hello" }

【讨论】:

  • 它是如何工作的,我的意思是 xmlhttp 解析响应。因为我只发送一个反斜杠 \x22 和 XHR 返回字符串,如 '\x22' 什么是字符串 '\\x22' 我阅读了 w3c 规范,我知道 utfdecoder w3.org/TR/XMLHttpRequest/#text-response-entity-body 但我找不到它,找不到 XHR 如何解析反斜杠,如何不解析反斜杠?我想在 responseText =(
  • @user2773677 responseText 除了尝试将其读取为文本与二进制文件(并假设响应为 UTF-8 编码)之外,不会对其进行解析。它是响应正文的“raw”或逐字形式。因此,\x22 被读取为 4 个单独的字符,并且等于 JavaScript 中 "\\x22" 字符串文字的值。
  • 乔纳森,我明白了。这意味着,原始值必须转换为 js 视图?但是在原始值中我们有一个斜杠 \x0A 什么意思是新行,js 必须转义它,不是吗?或者它可能发生在 JS 核心中,我的意思是 C++(v8 或其他)?
【解决方案2】:

为什么不让 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"

【讨论】:

  • 好吧,之前没有提到 jQuery,但除此之外是个好建议。 :)
  • @JonathanLonowski 啊,确实 - 它只是 JSON 解析器。并不是说我的代码中有任何 jQuery :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2013-10-12
  • 2012-07-14
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多