web-dev-qa-db-ja.com

文字列を16進数にエンコード

文字列を16進数に変換する関数があります。

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

例:

_守护村子_

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

出力は次のようになります。

_e5ae88e68aa4e69d91e5ad90_

漢字に対応しています。でも英語の文字でやると

alert(encode('Hello World'));

それは出力します:

_hello20world_

文字列を16進数に変換するためにこれを試しました:

_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に変換する方法も検索しましたが、うまくいきませんでした。誰でも手伝ってくれる?ありがとう!

6
John Pangilinan

_utf8.js_をダウンロードして解決しました

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

次に、上記の_String2Hex_関数を使用します。

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

私が望む出力を私に与えます:

_e5ae88e68aa4e69d91e5ad90_

2
John Pangilinan
const myString = "This is my string to be encoded/decoded";
const encoded = new Buffer(myString).toString('hex'); // encoded === 54686973206973206d7920737472696e6720746f20626520656e636f6465642f6465636f646564
const decoded = new Buffer(encoded, 'hex').toString(); // decoded === "This is my string to be encoded/decoded"
11
Cassio

これはうまくいくはずです

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);
    }
0
hannad rehman

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/

0
Ruben Reyes

関数型の自己完結型ソリューションとして、次のものでエンコードできます。

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

空の文字列のsplitは、各要素に1つの文字(または、むしろ1つのUTF-16コードポイント)を持つ配列を生成します。次に、それぞれを文字コードのHEX文字列にマップできます。

次にデコードします:

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

今回はsplitに渡された正規表現が2文字のグループをキャプチャしますが、この形式のsplitは、空の文字列(キャプチャされたグループの「間」のもの)を散在させます。したがって、filterは空の文字列を削除するために使用されます。次に、mapは各文字をデコードします。

0