javascriptに32ビット整数の配列があります。それを16進文字列に変換し、必要に応じてその16進文字列から同じ32ビット整数配列を再度構築するにはどうすればよいですか?
hexString = yourNumber.toString(16); 数値を16進数に変換するために使用できますが、数値の配列が16進文字列に変換される場合(連続するか、文字で区切られます)、その文字列から数値の配列を取得するにはどうすればよいですか?
javascriptに32ビット整数の配列があります。それを16進文字列に変換し、必要に応じてその16進文字列から同じ32ビット整数配列を再度構築するにはどうすればよいですか?
hexString = yourNumber.toString(16); 数値を16進数に変換するために使用できますが、数値の配列が16進文字列に変換される場合(連続するか、文字で区切られます)、その文字列から数値の配列を取得するにはどうすればよいですか?
カンマなしでやりたい場合
[3546,-24,99999,3322]==>"00000ddaffffffe80001869f00000cfa"
次に、各数値に8桁の16進数を使用して文字列を作成できます。もちろん、8桁より短い数字をゼロパッドする必要があります。また、負の値を適切に処理する には、数値が2つの補数でエンコードされていることを確認する必要があります。
その方法は次のとおりです。
var a = [3546,-24,99999,3322];
alert("Original is " + JSON.stringify(a)); // [3546,-24,99999,3322]
// convert to hex string...
//
var b = a.map(function (x) {
x = x + 0xFFFFFFFF + 1; // twos complement
x = x.toString(16); // to hex
x = ("00000000"+x).substr(-8); // zero-pad to 8-digits
return x
}).join('');
alert("Hex string " + b); // 00000ddaffffffe80001869f00000cfa
// convert from hex string back to array of ints
//
c = [];
while( b.length ) {
var x = b.substr(0,8);
x = parseInt(x,16); // hex string to int
x = (x + 0xFFFFFFFF + 1) & 0xFFFFFFFF; // twos complement
c.push(x);
b = b.substr(8);
}
alert("Converted back: " + JSON.stringify(c)); // [3546,-24,99999,3322]
上記の例を示すjsFiddleを次に示します。
どうぞ:
var a = [3546,-24,99999,3322];
alert("Original is " + JSON.stringify(a));
var b = (a.map(function (x) {return x.toString(16);})).toString();
alert("Hex string " + b);
var c = b.split(",").map(function (x) {return parseInt(x, 16);});
alert("Converted back: " + JSON.stringify(c));
補遺
OPは、コンマ以外の区切り文字の使用について質問しました。わずかな調整のみが必要です。セミコロンを使用したバージョンは次のとおりです。
var a = [3546,-24,99999,3322];
alert("Original is " + JSON.stringify(a));
var b = (a.map(function (x) {return x.toString(16);})).join(";");
alert("Hex string " + b);
var c = b.split(";").map(function (x) {return parseInt(x, 16);});
alert("Converted back: " + JSON.stringify(c));
var ints = [1,2,30,400];
var hexstr = "";
for(var i=0; i < ints.length; i++) {
hexstr += ints[i].toString(16) + ";";
}
document.write("Hex: " + hexstr + "<br>");
var intsback = new Array();
var hexarr = hexstr.split(";");
for(var i = 0; i < hexarr.length-1; i++) {
intsback.push(parseInt(hexarr[i], 16));
}
document.write("Integers back: " + intsback);
すべてのブラウザで機能するプレーンなJavaScriptを使用して変換を行うための2つの関数を次に示します。
var nums = [3456, 349202, 0, 15, -4567];
function convertNumArrayToHexString(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
result.push(list[i].toString(16));
}
return(result.join(","));
}
function convertHexStringToNumArray(str) {
var result = [];
var list = str.split(/\s*,\s*/);
for (var i = 0; i < list.length; i++) {
result.push(parseInt(list[i], 16));
}
return(result);
}
var temp = convertNumArrayToHexString(nums);
temp = convertHexStringToNumArray(temp);
そして、実用的なデモ:http: //jsfiddle.net/jfriend00/3vmNs/
16進文字列から整数配列(例、0E0006006200980000000000000000)
dataToNumberArr(data) {
if(data.length == 2) {
let val = parseInt(data, 16);
return [val];
} else if(data.length > 2) {
return dataToNumberArr(data.substr(0, 2)).concat(dataToNumberArr(data.substr(2)));
}
}
parseInt(hexString、16)を呼び出して、16進文字列を整数値に変換できます。