JavaScript에서 Hex를 ASCII로 변환하는 방법은 무엇입니까?


78

JavaScript 에서 Hex문자열을 ASCII문자열 로 변환하는 방법은 무엇입니까?

전의:

32343630 2460이됩니다.


7
나는 그것을위한 jQuery 플러그인이 있다고 확신한다 ^^
AndiDog

2
jQuery는 주로 DOM 조작을위한 것이며 덜한 범위에서 Array.prototype.{map,forEach}()구식 / 제한된 브라우저 와 같은 것을 다시 구현 합니다. 솔직히 이것은 Underscore.js의 영역 처럼 보입니다 .
Chinoto Vokro 2016 년

1
노드를 사용하여 우리의 사람들을 위해 @AndiDog 유용하지 않음
아담 F

답변:


158
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'

2
작동하지 않습니다. console.log(hex2a('32343630') === hex2a('3234363000')); // returns 'true'!!!.
steinybot

3
이 대답은 다음과 같은 이유로 잘못되었습니다 && hex.substr(i, 2) !== '00'. @steinybot이 알아 차렸 듯이 이것은 첫 번째에서 중단 0되므로 16 진수를 문자열로 완전히 변환하지 않습니다. 올바른 해결책은 다음과 같습니다. 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; }
Marc Wäckerlin

편집 이력 쇼는 것을 NUL결함 목적에 추가되었습니다. 이 답변은 손상되었습니다.
Don Cruickshank

36

완전성을 위해 역 기능 :

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

3
이 구현에 대한 참고 사항 : hex값이 0x0과 0x9 사이에 있으면 "0"을 수동으로 삽입해야합니다 . 이를 위해 귀하 arr.push(hex)arr.push(hex.length > 1 && hex || "0" + hex);.
Beterraba

문자열 연결은 실제로 문자열 배열 생성 및 자바 스크립트 결합보다 빠릅니다
Mala

1
오타가 있습니다 toString(16). (4 행) 뒤에 닫는 괄호를 넣는 것을 잊었습니다 . ;-)
아르 준

29

다른 방법 (Node.js를 사용하는 경우) :

var input  = '32343630';
const output = Buffer.from(input, 'hex');
log(input + " -> " + output);  // Result: 32343630 -> 2460

1
최고의 솔루션! 기본 기능 사용. 이것이 받아 들여진 대답이어야합니다!
Milkncookiez

그런 다음 outputASCII 로 변환 하려면output.toString()
rmanna

new Buffer(input,"hex").toString()원래 문자열 밖으로 준다
말리크 bagwala

21

이것을 사용할 수 있습니다 ..

var asciiVal = "32343630".match(/.{1,2}/g).map(function(v){
      return String.fromCharCode(parseInt(v, 16));
    }).join('');
    
document.write(asciiVal);


8

web3 라이브러리 에 유용한 기능이 있습니다.

var hexString = "0x1231ac"
string strValue = web3.toAscii(hexString)

4

** Hexa to String **

let input  = '32343630';

참고 : let output = new Buffer (input, 'hex'); // 더 이상 사용되지 않습니다.

let buf = Buffer.from(input, "hex");
let data = buf.toString("utf8");

3
왜 이것이 반대 투표인지 확실하지 않습니다. 이것이 2020 년 nodejs에 대한 최선의 대답 인 것 같습니다
Pascal Belloncle

@PascalBelloncle 이것이 Node.js에 대한 최선의 대답이라는 데 동의하지만 문제는 Buffer일반 JavaScript에는 존재하지 않는다는 것입니다. 나는 질문이 Node.js가 아닌 JavaScript로 태그가 지정 되었기 때문에 반대표를 던졌다 고 생각합니다.
Don Cruickshank

3

02(STX) 또는 03(ETX) 와 같은 제어 문자를 처리해야하는 경우 위의 솔루션이 작동하지 않는다는 것을 발견했습니다. 그 아래의 10모든 것은 한 자리 숫자로 읽히고 이후 모든 것을 버립니다. 직렬 통신을 통해 구문 분석하려고이 문제가 발생했습니다. 그래서 먼저받은 16 진수 문자열을 버퍼 객체에 넣은 다음 16 진수 문자열을 다음과 같이 문자열 배열로 변환했습니다.

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);

}

그런 다음 .join it

message = msgArray.join('');

그런 다음 위 의 @Delan Azabani의 답변 hexToAscii과 같은 기능을 만들었습니다 ...

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);

이 접근 방식을 사용하면 배열을 반복하고 제어 문자를 사용하여 전송의 다른 부분으로 분할 할 수 있으므로 원하는 데이터의 일부만 처리 할 수 ​​있습니다. 이것이 다른 사람에게 도움이되기를 바랍니다!


1

console.log(

"68656c6c6f20776f726c6421".match(/.{1,2}/g).reduce((acc,char)=>acc+String.fromCharCode(parseInt(char, 16)),"")

)


0

@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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.