JavaScript - 将 UTF8 编码/解码为十六进制以及十六进制为 UTF8

Gil*_*ain 3 javascript encoding hex utf-8

在我的客户端/服务器应用程序中,我从服务器获取十六进制格式的字符串,我需要将其转换为 UTF8。然后,经过一些操作后,我需要将字符串从 UTF8 编码回十六进制,然后返回到服务器。

我构建了这个函数来将十六进制字符串解析为 UTF8。然而,当我尝试反转这个算法时,我得到了完全不同的东西。

这是我的测试:

function hexToUtf8(s)
{
  return decodeURIComponent(
     s.replace(/\s+/g, '') // remove spaces
      .replace(/[0-9a-f]{2}/g, '%$&') // add '%' before each 2 characters
  );
}

function utf8ToHex(s)
{
  return encodeURIComponent(s).replace(/%/g, ""); // remove all '%' characters
}

var hex = "52656c6179204f4e214f706572617465642062792030353232";

var utf8 = hexToUtf8(hex); // result: "Relay ON!Operated by 0522" (correct value)
var hex2 = utf8ToHex(utf8); // result: "Relay20ON!Operated20by200522" (some junk)

console.log("Hex: " + hex);
console.log("UTF8: " + utf8);
console.log("Hex2: " + hex2);
console.log("Is conversion OK: " + (hex == hex2)); // false
Run Code Online (Sandbox Code Playgroud)

Kei*_*ith 5

您的 utf8toHex 正在使用encodeURIComponent,这不会使所有内容都变为十六进制。

所以我稍微修改了你的 utf8toHex 以处理十六进制。

Update Forgot toString(16) 不会将十六进制预置零,因此如果它们的值小于 16,例如。换行等会失败所以,添加 0 并切片以确保。

更新2,使用TextEncoder,这将比使用charCodeAt更好地处理UTF-8。

function hexToUtf8(s)
{
  return decodeURIComponent(
     s.replace(/\s+/g, '') // remove spaces
      .replace(/[0-9a-f]{2}/g, '%$&') // add '%' before each 2 characters
  );
}

const utf8encoder = new TextEncoder();

function utf8ToHex(s)
{
  const rb = utf8encoder.encode(s);
  let r = '';
  for (const b of rb) {
    r += ('0' + b.toString(16)).slice(-2);
  }
  return r;
}


var hex = "d7a452656c6179204f4e214f706572617465642062792030353232";

var utf8 = hexToUtf8(hex);
var hex2 = utf8ToHex(utf8);

console.log("Hex: " + hex);
console.log("UTF8: " + utf8);
console.log("Hex2: " + hex2);
console.log("Is conversion OK: " + (hex == hex2));
Run Code Online (Sandbox Code Playgroud)