7

我有一个包含十六进制字符串的字符串(utf8 字符串的内容)

"666f6f6c 6973686e 6573732c 20697420 77617320 74686520 65706f63 68206f66 2062656c 6965662c 20697420 77617320 74686520 65706f63 68206f66 20696e63 72656475 6c697479 2c206974 20776173 20746865 20736561 736f6e20 6f66204c 69676874 2c206974 20776173 20746865 2073656"

我需要将其转换回 javascript 字符串。怎么做 ?

4

4 回答 4

19
var s = "666f6f6c 6973686e 6573732c 20697420 77617320 74686520 65706f63 68206f66 2062656c 6965662c 20697420 77617320 74686520 65706f63 68206f66 20696e63 72656475 6c697479 2c206974 20776173 20746865 20736561 736f6e20 6f66204c 69676874 2c206974 20776173 20746865 2073656";
var r = decodeURIComponent(s.replace(/\s+/g, '').replace(/[0-9a-f]{2}/g, '%$&'));

该解决方案实际上处理 UTF-8。

这个想法是%在每对十六进制数字前面放一个(从而创建一个 URL 编码字符串),然后让decodeURIComponent处理细节(特别是,它将正确解码多字节 UTF-8 字符)。

于 2012-12-13T17:59:55.953 回答
1

要正确处理 UTF8,您可能需要尝试这种方法:

    function utf8ToHex(str) {
      return Array.from(str).map(c => 
        c.charCodeAt(0) < 128 ? c.charCodeAt(0).toString(16) : 
        encodeURIComponent(c).replace(/\%/g,'').toLowerCase()
      ).join('');
    },
    function hexToUtf8: function(hex) {
      return decodeURIComponent('%' + hex.match(/.{1,2}/g).join('%'));
    }

演示:https ://jsfiddle.net/lyquix/k2tjbrvq/

于 2020-04-14T15:04:06.983 回答
0

仅节点解决方案。有一个Buffer类可以在数据之间进行转换(例如 utf 字节和 utf8 字符串。

Buffer.from(0x66, 0x6f, 0x6f, 0x6c).toString(); // 'fool'

因此,对于以空格分隔的字节字符串格式,您将:

let s = '666f6f6c 6973686e 6573732c';

// [102, 111, 111, 108, 105, 115, 104, 110, 101, 115, 115, 44]
let bytes = [...s.matchAll(/[^ ]{1,2}/g)].map(a => parseInt('0x' + a[0]));

Buffer.from(bytes).toString(); // 'foolishness,'
于 2021-08-05T14:20:22.637 回答
-1

用这个:

function HexToString(s) {
  var escaped = "";
  var hex = "";
  if(s.length%4 > 0) {
    for (i = 0; i < (4 - (s.length % 4)); i++) {
      hex += "0";
    }
  }
  hex += s;
  for (var i = 0; i < hex.length; i += 4) {
    escaped += "%u" + hex.charAt(i) + hex.charAt(i + 1) + hex.charAt(i + 2) + hex.charAt(i + 3);
  }
  return unescape(escaped).split(unescape("%00")).join("");
}

它对我有用。

于 2018-04-15T14:17:40.300 回答