How to convert from Hex
string to ASCII
string in JavaScript?
Ex:
32343630 it will be 2460
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;
}
hex2a('32343630'); // returns '2460'
console.log(hex2a('32343630') === hex2a('3234363000')); // returns 'true'!!!
.
Commented
Jun 4, 2020 at 10:56
&& hex.substr(i, 2) !== '00'
. As @steinybot noticed, this aborts on the first 0
and therefore does not completely convert hex to string. The correct solution is: 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; }
Commented
Jul 7, 2020 at 11:00
NUL
defect was added on purpose. This answer has been damaged.
Commented
Jul 18, 2020 at 11:39
Another way to do it (if you use Node.js):
var input = '32343630';
const output = Buffer.from(input, 'hex');
log(input + " -> " + output); // Result: 32343630 -> 2460
new Buffer(input,"hex").toString()
gives out the original string
Commented
Jul 13, 2020 at 9:24
For completeness sake the reverse function:
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
value is between 0x0 and 0x9. For this, I change your arr.push(hex)
to arr.push(hex.length > 1 && hex || "0" + hex);
.
Commented
May 16, 2014 at 19:25
toString(16)
(line no. 4). ;-)
You can use this..
var asciiVal = "32343630".match(/.{1,2}/g).map(function(v){
return String.fromCharCode(parseInt(v, 16));
}).join('');
document.write(asciiVal);
** for Hexa to String**
let input = '32343630';
Note : let output = new Buffer(input, 'hex'); // this is deprecated
let buf = Buffer.from(input, "hex");
let data = buf.toString("utf8");
Buffer
doesn't exist in regular JavaScript. I expect the downvote was because the question is tagged with JavaScript and not Node.js.
Commented
Jul 18, 2020 at 13:48
Buffer.from("414243", "hex")
works on Node.js but it fails on Edge and Firefox as Buffer
is not defined.
Commented
Jul 24, 2021 at 21:34
I found a useful function present in web3 library.
var hexString = "0x1231ac"
string strValue = web3.toAscii(hexString)
Update: Newer version of web3 has this function in utils
The functions now resides in utils:
var hexString = "0x1231ac"
string strValue = web3.utils.hexToAscii(hexString)
web3.utils.hexToAscii(hexString)
in v1.2.9 web3js.readthedocs.io/en/v1.2.9/…
Commented
Mar 16, 2021 at 5:29
console.log(
"68656c6c6f20776f726c6421".match(/.{1,2}/g).reduce((acc,char)=>acc+String.fromCharCode(parseInt(char, 16)),"")
)
I've found that the above solution will not work if you have to deal with control characters like 02
(STX) or 03
(ETX), anything under 10
will be read as a single digit and throw off everything after. I ran into this problem trying to parse through serial communications. So, I first took the hex string received and put it in a buffer object then converted the hex string into an array of the strings like so:
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);
}
Then .join it
message = msgArray.join('');
then I created a hexToAscii
function just like in @Delan Azabani's answer above...
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;
}
then called the hexToAscii
function on 'message'
message = hexToAscii(message);
This approach also allowed me to iterate through the array and slice into the different parts of the transmission using the control characters so I could then deal with only the part of the data I wanted. Hope this helps someone else!
An optimized version of the implementation of the reverse function proposed by @michieljoris (according to the comments of @Beterraba and @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
I use this one, it seems more clear to me as I also receive data with spaces like '30 31 38 30 38 30' and the output is 018080
hexToString(hex: string): string {
return hex.split(' ').map(s => string.fromCharCode(parseInt(s,16))).join('');
}
Array.prototype.{map,forEach}()
for outdated/limited browsers. Honestly this seems more like Underscore.js's realm.