Як перетворити з Hexрядка в ASCIIрядок у JavaScript?
Приклад:
32343630 це буде 2460
Як перетворити з Hexрядка в ASCIIрядок у JavaScript?
Приклад:
32343630 це буде 2460
Array.prototype.{map,forEach}()застарілі / обмежені браузери. Чесно кажучи, це здається більше схожим на сферу Underscore.js .
Відповіді:
function hex2a(hexx) {
var hex = hexx.toString();//force conversion
var str = '';
for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2)
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
return str;
}
hex2a('32343630'); // returns '2460'
console.log(hex2a('32343630') === hex2a('3234363000')); // returns 'true'!!!.
&& hex.substr(i, 2) !== '00'. Як зауважив @steinybot, це переривається на першому, 0а отже, не повністю перетворює шістнадцятковий формат у рядок. Правильним рішенням є: function hex2a(hexx) { var hex = hexx.toString();//force conversion var str = ''; for (var i = 0; i < hex.length; i += 2) str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); return str; }
NULдефект був доданий спеціально. Цю відповідь пошкоджено.
Для повноти функція зворотного:
function a2hex(str) {
var arr = [];
for (var i = 0, l = str.length; i < l; i ++) {
var hex = Number(str.charCodeAt(i)).toString(16);
arr.push(hex);
}
return arr.join('');
}
a2hex('2460'); //returns 32343630
hexзначення знаходиться між 0x0 і 0x9. Для цього я міняю вашу arr.push(hex)на arr.push(hex.length > 1 && hex || "0" + hex);.
toString(16)(рядок № 4). ;-)
Інший спосіб зробити це (якщо ви використовуєте Node.js):
var input = '32343630';
const output = Buffer.from(input, 'hex');
log(input + " -> " + output); // Result: 32343630 -> 2460
outputна ASCII, використовуйтеoutput.toString()
new Buffer(input,"hex").toString()видає оригінальний рядок
Ви можете використовувати це ..
var asciiVal = "32343630".match(/.{1,2}/g).map(function(v){
return String.fromCharCode(parseInt(v, 16));
}).join('');
document.write(asciiVal);
** для Hexa в рядок **
let input = '32343630';
Примітка: нехай output = новий буфер (вхід, 'hex'); // це застаріло
let buf = Buffer.from(input, "hex");
let data = buf.toString("utf8");
Bufferщо не існує в звичайному JavaScript. Я сподіваюся, що голосування проти було тому, що питання позначене JavaScript, а не Node.js.
Я виявив, що вищезазначене рішення не буде працювати, якщо вам доведеться мати справу з контрольними символами, такими як 02(STX) або 03(ETX), все, що знаходиться під, 10буде читатися як одна цифра і скидати все після. Я зіткнувся з цією проблемою, намагаючись проаналізувати через послідовний зв’язок. Отже, я спочатку взяв отриманий шістнадцятковий рядок і помістив його в буферний об’єкт, а потім перетворив шістнадцятковий рядок у масив рядків таким чином:
buf = Buffer.from(data, 'hex');
l = Buffer.byteLength(buf,'hex');
for (i=0; i<l; i++){
char = buf.toString('hex', i, i+1);
msgArray.push(char);
}
Тоді .приєднуйтесь до нього
message = msgArray.join('');
тоді я створив hexToAsciiфункцію, як у відповіді @Delan Azabani вище ...
function hexToAscii(str){
hexString = str;
strOut = '';
for (x = 0; x < hexString.length; x += 2) {
strOut += String.fromCharCode(parseInt(hexString.substr(x, 2), 16));
}
return strOut;
}
потім викликається hexToAsciiфункція на 'повідомлення'
message = hexToAscii(message);
Цей підхід також дозволив мені перебирати масив і нарізати різні частини передачі, використовуючи контрольні символи, щоб я міг мати справу лише з тією частиною даних, яку хотів. Сподіваюся, це допомагає комусь іншому!
console.log(
"68656c6c6f20776f726c6421".match(/.{1,2}/g).reduce((acc,char)=>acc+String.fromCharCode(parseInt(char, 16)),"")
)
Оптимізована версія реалізації зворотної функції, запропонована @michieljoris (згідно з коментарями @Beterraba та @Mala):
function a2hex(str) {
var hex = '';
for (var i = 0, l = str.length; i < l; i++) {
var hexx = Number(str.charCodeAt(i)).toString(16);
hex += (hexx.length > 1 && hexx || '0' + hexx);
}
return hex;
}
alert(a2hex('2460')); // display 32343630