将字符串编码为HEX

Encode String to HEX

本文关键字:HEX 编码 字符串      更新时间:2023-09-26

我有将字符串转换为十六进制的函数:

function encode(str){
    str = encodeURIComponent(str).split('%').join('');
    return str.toLowerCase();
}

示例:

守护村子

alert(encode('守护村子'));

输出将是:

e5ae88e68aa4e69d91e5ad90

它适用于汉字。但当我用英文字母做的时候

alert(encode('Hello World'))

它输出:

hello20world

我尝试过将字符串转换为十六进制:

function String2Hex(tmp) {
    var str = '';
    for(var i = 0; i < tmp.length; i++) {
        str += tmp[i].charCodeAt(0).toString(16);
    }
    return str;
}

然后在上面的汉字上尝试了一下,但它输出的是UTF-8 HEX:

5b8862a467515b50

不是ANSI Hex:

e5ae88e68aa4e69d91e5ad90

我也搜索过将UFT8转换为ANSI,但没有运气。有人能帮我吗?谢谢

作为一个功能风格的自包含解决方案,您可以使用进行编码

plain.split("")
     .map(c => c.charCodeAt(0).toString(16).padStart(2, "0"))
     .join("");

空字符串上的split生成一个数组,每个元素中有一个字符(或者更确切地说,一个UTF-16代码点)。然后我们可以将每个映射到字符代码的十六进制字符串。

然后解码:

hex.split(/('w'w)/g)
   .filter(p => !!p)
   .map(c => String.fromCharCode(parseInt(c, 16)))
   .join("")

这一次,传递给split的regex捕获两个字符的组,但这种形式的split将用空字符串穿插它们(捕获的组之间的东西,什么都不是!)。因此使用filter来移除空字符串。然后map对每个字符进行解码。

在Node.js上,您可以执行:

const myString = "This is my string to be encoded/decoded";
const encoded = Buffer.from(myString).toString('hex'); // encoded == 54686973206973206d7920737472696e6720746f20626520656e636f6465642f6465636f646564
const decoded = Buffer.from(encoded, 'hex').toString(); // decoded == "This is my string to be encoded/decoded"

我通过下载utf8.js 解决了这个问题

https://github.com/mathiasbynens/utf8.js

则使用上面的CCD_ 14函数:

alert(String2Hex(utf8.encode('守护村子')));

它给了我想要的输出:

e5ae88e68aa4e69d91e5ad90

这应该可以工作。

var str="some random string";
var result = "";
for (i=0; i<str.length; i++) {
    hex = str.charCodeAt(i).toString(16);
    result += ("000"+hex).slice(-4);
}

如果您想正确处理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(hex) {
  return decodeURIComponent('%' + hex.match(/.{1,2}/g).join('%'));
}

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

的另一种方法

function toHex(txt){
    const encoder = new TextEncoder();
    return Array
        .from(encoder.encode(txt))
        .map(b => b.toString(16).padStart(2, '0'))
        .join('')
}