JavaScript - кодирование / декодирование UTF8 в шестнадцатеричный код и шестнадцатеричный код в UTF8 - PullRequest
0 голосов
/ 03 марта 2020

В моем клиент-серверном приложении я получаю с сервера строку в шестнадцатеричном формате, которую мне нужно преобразовать в UTF8. Затем, после некоторых манипуляций, мне нужно закодировать строку обратно из UTF8 в Hex и вернуть на сервер.

Я построил эту функцию для анализа шестнадцатеричной строки в 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

1 Ответ

2 голосов
/ 03 марта 2020

Ваш utf8toHex использует encodeURIComponent, и это не сделает все HEX.

Так что я немного изменил ваш utf8toHex для обработки HEX.

Обновление Forgot toString (16 ) не обнуляет гекс, поэтому, если они были меньше 16, например. переводы строк и т. д. c это приведет к сбою Итак, чтобы добавить 0 и нарезать, чтобы убедиться.

Обновление 2, используйте TextEncoder, это будет обрабатывать UTF-8 намного лучше, чем использовать charCodeAt. * ​​1008 *

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...