JavaScript에서 십진수를 16 진수로 변환하는 방법


1479

JavaScript에서 십진수 값을 16 진수로 변환하는 방법은 무엇입니까?


7
문자열 표현에서 시작한다는 경고는 16 진수로 변환 할 때 숫자로 변환 할 때 정밀도를 잃기 매우 쉽습니다. danvk.org/wp/2012-01-20/…를 참조하십시오 .
studgeek

기능은 당신이 필요로 정확히
모하마드 Musavi

답변:


2474

다음을 사용하여 숫자를 16 진수 문자열로 변환하십시오.

hexString = yourNumber.toString(16);

그리고 다음과 같이 프로세스를 되돌립니다.

yourNumber = parseInt(hexString, 16);

42
이 경우 yourNum은 16 진 문자열입니다. 예 : (255) .toString (16) == 'ff'&& parseInt ( 'ff', 16) == 255
Prestaul

8
@forste,이 기술을 사용하여 자바 스크립트 Number (ECMA 스크립트에서 Double 인 Number 객체)를 16 진수로 변환하면 "정확도를 잃지"않습니다. 링크 된 질문은 구체적으로 너무 큰 숫자를 참조하여 Double에 맞지 않습니다 (따라서 질문의 문자열 표현). 번호가 있으면 작동합니다. javascript Number 객체 (Double)가 되기에는 너무 큰 것이 있으면 다른 것을 찾아야합니다.
Prestaul

12
@Derek, 나는 불필요한 괄호를 용납하지 못하게하는 심리적 문제가 있습니다 ... @ everyone-else yourNumber는 변수입니다. 숫자 리터럴을 사용하려면 다음과 같은 작업을 수행해야 (45).toString(16)하지만 숫자를 하드 코딩하는 경우 16 진수 문자열로 직접 작성하십시오 ... (45).toString(16)항상 같을 '2d'것이므로 CPU를 낭비하지 마십시오 그것을 알아 내기 위해 순환합니다.
Prestaul

21
@Prestaul "CPU 사이클을 낭비하지 말아라"-이른 최적화라고합니다. JavaScript가 286에서 실행되지 않으면 오버 헤드가 중요합니다. 또한 '45'는 프로그래머가 인식 할 수 있어야하는 마법의 숫자 일 수 있습니다 (예 : 시간 초과 기간 (초)). 반면 '2d'는 누가 그것을 인식할까요?
Dejay Clayton

47
괄호가 마음에 들지 않으면 추가 점을 사용할 수 있습니다.42..toString(16)
Thomas Watson

142

비트 필드 또는 32 비트 색상과 같은 것을 처리해야하는 경우 부호있는 숫자를 처리해야합니다. JavaScript 함수 toString(16)는 일반적으로 원하는 것이 아닌 음의 16 진수를 반환합니다. 이 함수는 양수로 만들기 위해 미친 듯이 추가합니다.

function decimalToHexString(number)
{
  if (number < 0)
  {
    number = 0xFFFFFFFF + number + 1;
  }

  return number.toString(16).toUpperCase();
}

console.log(decimalToHexString(27));
console.log(decimalToHexString(48.6));


5
그게 2의 보수입니까?
Julian

2
JavaScript는 모든 32 비트 비트 필드를 부호없는 숫자로 나타낼 수 있으므로 일반적으로이 변환은 필요하지 않습니다 (Number.MAX_SAFE_INTEGER 참조). : 부호로 변환이 같이 쓸 수있다 같은 이유로number = 0x100000000 + number;
요하네스 Matokic

3
내 이전 의견에 대한 짧은 메모 : 16 진수 표현은 Number.MAX_SAFE_INTEGER까지의 숫자에서 작동하지만 비트 연산 (32 비트 색상을 만드는 데 자주 사용됨)에는 적용되지 않습니다. 비트 연산의 결과는 항상 부호있는 32 비트 정수입니다. 따라서 비트 결과> = 2 ^ 31은 음수이고 0x100000000 | 0 === 0.
Johannes Matokic

25
>>>연산자를 사용 하여 숫자를 부호없는 표현 (예 : ((-3253) >>> 0).toString(16)returns) 으로 변환 할 수 있습니다 "fffff34b".
csharpfolk

1
+1유용한 추가를 위해 숫자를 다른 표기법으로 변환하는 경우 모든 숫자가 이미 "보통"양수이거나 그렇지 않은 경우 부정적인 결과를 원합니다.
Carl Smith

82

아래 코드는 10 진수 값 d를 16 진수로 변환합니다. 또한 16 진 결과에 패딩을 추가 할 수 있습니다. 따라서 0은 기본적으로 00이됩니다.

function decimalToHex(d, padding) {
    var hex = Number(d).toString(16);
    padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;

    while (hex.length < padding) {
        hex = "0" + hex;
    }

    return hex;
}

5
음수 값을 제대로 처리하지 못합니다. decimalToHex (-6, 4)는 00-6을 반환합니다.
JonMR

3
또한 float에 문제가 있지만 Math.round ()를 넣으면 문제가 해결되었습니다. (+ 1ed)
Michael-Clay Shirky는 어디에 있습니까

배열 ( '255,0,55'등)에서 숫자를 "풀링"하고 .toString (16)이 작동하지 않았습니다. 내가 얻은 건 모두 같은 숫자였습니다! "Number"기능을 앞에 추가했는데 이제 작동합니다! 해결책을 찾으려고 약 4 시간 만 보냈습니다 !!
Cristofayre

65
function toHex(d) {
    return  ("0"+(Number(d).toString(16))).slice(-2).toUpperCase()
}

1
function hexRep(number, width) { return (number+Math.pow(16, precision)).toString(16).slice(-width); }
Lori

2
확장하기가 어렵지 않습니다. 마지막 숫자를 .slice (-number)로 자릅니다. 앞에 0을 더 추가하면 정상적으로 작동합니다.
Tataize

19
ES6 const hex = d => Number(d).toString(16).padStart(2, '0')😁
닌 팜

39

완전성을 위해 2의 보수 16 진수를 음수로 나타내려면 zero-fill-right shift >>>연산자를 사용할 수 있습니다 . 예를 들어 :

> (-1).toString(16)
"-1"

> ((-2)>>>0).toString(16)
"fffffffe"

그러나 한 가지 제한 사항이 있습니다. JavaScript 비트 연산자는 피연산자를 32 비트 시퀀스로 취급합니다 . 즉, 32 비트 2의 보수를 얻습니다.


2
이 :이 질문에 대한 지금까지 가장 가치있는 대답입니다
albertjan

C# number to hexadecimal다른 결과가 나왔기 때문에 모든 질문을 조사했습니다 Javascript number to hexadecimal. Javascript에 음수 문제가있는 것 같습니다. 이 답변은 문제에 대한 해결책 인 것 같습니다.
goamn

대단히 도움이되었습니다. 감사합니다! 나는 이것을 RGB 색상에 사용하여 24 비트 변형을 얻으려면 처음 두 문자 (추가 FF)를 ((-2)>>>0).toString(16).substring(2)
자르십시오.

36

패딩 포함 :

function dec2hex(i) {
   return (i+0x10000).toString(16).substr(-4).toUpperCase();
}

2
@Lucas 마지막 4자를 반환합니다.
Gabriel

19

루프없이 :

function decimalToHex(d) {
  var hex = Number(d).toString(16);
  hex = "000000".substr(0, 6 - hex.length) + hex;
  return hex;
}

// Or "#000000".substr(0, 7 - hex.length) + hex;
// Or whatever
// *Thanks to MSDN

또한 평가해야하는 루프 테스트를 사용하지 않는 것이 좋습니까?

예를 들어,

for (var i = 0; i < hex.length; i++){}

있다

for (var i = 0, var j = hex.length; i < j; i++){}

19

RGB- 값 대 16 진 함수에 대한 다음과 같은 좋은 아이디어를 결합합니다 ( #HTML / CSS 의 다른 곳에 추가 ).

function rgb2hex(r,g,b) {
    if (g !== undefined)
        return Number(0x1000000 + r*0x10000 + g*0x100 + b).toString(16).substring(1);
    else
        return Number(0x1000000 + r[0]*0x10000 + r[1]*0x100 + r[2]).toString(16).substring(1);
}

감사합니다! 오래 전에 의견을 남기고 싶습니다. 내 대답의 열쇠였습니다. stackoverflow.com/questions/5560248/…
Pimp Trizkit

16

허용 된 답변은 16 진수 코드를 반환하는 한 자리수를 고려하지 않았습니다. 이것은 다음에 의해 쉽게 조정됩니다.

function numHex(s)
{
    var a = s.toString(16);
    if ((a.length % 2) > 0) {
        a = "0" + a;
    }
    return a;
}

function strHex(s)
{
    var a = "";
    for (var i=0; i<s.length; i++) {
        a = a + numHex(s.charCodeAt(i));
    }

    return a;
}

위 답변이 다른 형식으로 여러 번 게시되었다고 생각합니다. 나는 이것을 toHex () 함수로 포장합니다.

function toHex(s)
{
    var re = new RegExp(/^\s*(\+|-)?((\d+(\.\d+)?)|(\.\d+))\s*$/);

    if (re.test(s)) {
        return '#' + strHex( s.toString());
    }
    else {
        return 'A' + strHex(s);
    }
}

숫자 정규식은 웹 응용 프로그램의 효율성을 향상시키기 위해 10 개 이상의 유용한 JavaScript 정규식 함수 에서 가져 왔습니다 .

업데이트 :이 일을 여러 번 테스트 한 후 오류 (RegExp에서 큰 따옴표)를 발견하여 수정했습니다. 하나! 꽤 많은 테스트를 거친 후 almaz의 게시물을 읽은 후 음수를 얻을 수 없다는 것을 깨달았습니다.

또한-나는 이것에 대해 약간의 독서를했고 모든 JavaScript 숫자는 무엇이든 상관없이 64 비트 단어로 저장되기 때문에 64 비트 단어를 얻기 위해 numHex 코드를 수정하려고 시도했습니다. 그러나 그렇게 할 수 없다는 것이 밝혀졌습니다. "3.14159265"AS A NUMBER를 변수에 입력하면 소수 부분에 숫자에 10 (IE : 10.0)을 반복해서 곱해서 만 액세스 할 수 있으므로 "3"만 얻을 수 있습니다. 또는 다른 말로하면-16 진수 값 0xF는 부동 소수점 값 이 AND가되기 전에 정수 로 변환되어 기간 뒤의 모든 것을 제거합니다. 값을 전체 (예 : 3.14159265)로 가져와 0xF 값에 대해 부동 소수점 값을 AND 하는 대신.

따라서이 경우 가장 좋은 방법은 3.14159265를 문자열 로 변환 한 다음 문자열 을 변환하는 것입니다. 위의 값 때문에 마이너스 부호가 값 앞의 0x26이되기 때문에 음수를 쉽게 변환 할 수 있습니다.

그래서 내가 한 일은 변수에 숫자가 포함되어 있는지 확인하는 것입니다. 문자열로 변환하고 문자열을 변환하십시오. 이는 서버 측에서 들어오는 문자열을 16 진수로 풀고 들어오는 정보가 숫자인지 확인해야한다는 것을 모든 사람에게 의미합니다. 숫자 앞에 "#"을 추가하고 문자열 앞에 "A"를 추가하면 쉽게 할 수 있습니다. toHex () 함수를 참조하십시오.

즐기세요!

또 다른 해와 많은 생각 끝에 "toHex"기능 (및 "fromHex"기능도 있음)을 실제로 개선해야한다고 결정했습니다. 전체 질문은 "어떻게 더 효율적으로 할 수 있습니까?"였습니다. 16 진수로 /부터 16 진 함수는 무언가가 소수 부분이면 신경 쓰지 말고 동시에 분수 부분이 문자열에 포함되도록해야한다고 결정했습니다.

그래서 문제는 "16 진 문자열로 작업하고 있다는 것을 어떻게 알 수 있습니까?"입니다. 대답은 간단합니다. 전 세계에서 이미 인정 된 표준 사전 문자열 정보를 사용하십시오.

즉, "0x"를 사용하십시오. 이제 내 toHex 함수는 이미 존재하고 있는지 확인합니다. 그렇지 않으면 문자열, 숫자 등을 변환합니다. 다음은 개정 된 toHex 함수입니다.

/////////////////////////////////////////////////////////////////////////////
//  toHex().  Convert an ASCII string to hexadecimal.
/////////////////////////////////////////////////////////////////////////////
toHex(s)
{
    if (s.substr(0,2).toLowerCase() == "0x") {
        return s;
    }

    var l = "0123456789ABCDEF";
    var o = "";

    if (typeof s != "string") {
        s = s.toString();
    }
    for (var i=0; i<s.length; i++) {
        var c = s.charCodeAt(i);

        o = o + l.substr((c>>4),1) + l.substr((c & 0x0f),1);
    }

    return "0x" + o;
}

이것은 단일 숫자, 부동 소수점 숫자를 고려한 매우 빠른 기능이며, 사람이 16 진수 값을 다시 16 진수로 보내는 지 확인합니다. 4 개의 함수 호출 만 사용하며 그 중 2 개만 루프에 있습니다. 사용하는 값의 16 진수를 해제하려면 다음을 수행하십시오.

/////////////////////////////////////////////////////////////////////////////
//  fromHex().  Convert a hex string to ASCII text.
/////////////////////////////////////////////////////////////////////////////
fromHex(s)
{
    var start = 0;
    var o = "";

    if (s.substr(0,2).toLowerCase() == "0x") {
        start = 2;
    }

    if (typeof s != "string") {
        s = s.toString();
    }
    for (var i=start; i<s.length; i+=2) {
        var c = s.substr(i, 2);

        o = o + String.fromCharCode(parseInt(c, 16));
    }

    return o;
}

toHex () 함수와 마찬가지로 fromHex () 함수는 먼저 "0x"를 찾은 다음 들어오는 정보가 아직 문자열이 아닌 경우 문자열로 변환합니다. 나는 그것이 문자열이 아닌 방법을 모르지만 단지 경우에 따라 확인합니다. 그런 다음이 함수는 두 문자를 잡고 ASCII 문자로 변환합니다. 유니 코드를 번역하려면 루프를 한 번에 4 자씩 변경해야합니다. 그러나 문자열을 4로 나눌 수 없도록해야합니다. 이 경우-표준 16 진 문자열입니다. (문자열 앞에 "0x"가 있음을 기억하십시오.)

문자열로 변환 될 때 -3.14159265가 여전히 -3.14159265임을 보여주는 간단한 테스트 스크립트입니다.

<?php

    echo <<<EOD
<html>
    <head><title>Test</title>
        <script>
            var a = -3.14159265;
            alert( "A = " + a );
            var b = a.toString();
            alert( "B = " + b );
        </script>
    </head>
    <body>
    </body>
</html>
EOD;

?>

toString () 함수와 관련하여 JavaScript가 작동하는 방식 때문에 이전에 문제를 일으킨 문제를 모두 제거 할 수 있습니다. 이제 모든 문자열과 숫자를 쉽게 변환 할 수 있습니다. 또한 객체와 같은 것들로 인해 JavaScript 자체에서 오류가 발생합니다. 나는 이것이 얻을만큼 좋은 것으로 생각합니다. 남은 유일한 개선 사항은 W3C가 toHex () 및 fromHex () 함수를 JavaScript에 포함시키는 것입니다.


나는 ... 당신은 여전히 여기에 할 일이있어 생각 if( s.substr(0,2)하기 전에 if (typeof s != "string")아마 당신은 예를 들어, 원하는 것을하지 않습니다. 내가 돌아온 것은 내가 (중 무엇을 기대하지 않았다 toHex(0x1f635)제공 "0x313238353635"). 더 조사하지 않았습니다.
ruffin

당신이 틀렸다고 믿습니다. 귀하의 예는 문자열이 아니라 숫자 인 16 진수 문자열을 사용하고 있습니다. 따라서 1f635는 원래대로 나올 것입니다. "0x1f635"를 입력했다면 다르게 나왔을 것입니다. (예 : 루틴은 당신이 루틴에 전송했던 16 진수를 반환했을 것이다.) :-)
마크 매닝

첫 번째 요점은 substr& toLowerCase가 아닌 문자열에 & 를 사용할 수 없다는 것입니다 . 그래서 typeof더 빨리 필요하거나 또는 그렇지 toHex않은 문자열을 던질 것으로 예상 typeof되면 수표를 완전히 제거해야합니다 . 말이 되나요? 즉, 편집없이 코드를 여기에서 사용하고을 호출 toHex(0x1f635)하면 얻을 것 Uncaught TypeError: s.substr is not a function입니다. 문자열 캐스트를 더 일찍 움직이면, 맞습니다. 숫자가 먼저 10 진수로 캐스트되고 상황이 옆으로 이동합니다. 물론 s문자열이 아닌 경우 여기서 간단한 캐스트를 수행 할 수 없다는 것을 의미 합니다.
ruffin December

실제로 XP에서는 이것이 잘 작동합니다. Javascript를 typecast로 만드는 Javascript에 대한 많은 업데이트가있었습니다. 어느 것이 예외를 던질 것입니다. XP에서는 jusr이 작동합니다. 적어도 나에게는. 타입 캐스트 세계에서 "if (typeof s =="string "&& s.substr (0,2) =="0x ") {return s;}"를 입력하는 것이 적절합니다. 그러나 ox1f635는 여전히 문자열이 아닙니다. :-)
Mark Manning

12
var number = 3200;
var hexString = number.toString(16);

16은 기수이며 16 진수로 16 개의 값이 있습니다 :-)


12

관심있는 사람이라면 이 질문에 주어진 대부분의 답변을 비교하는 JSFiddle이 있습니다.

그리고 내가 끝내는 방법은 다음과 같습니다.

function decToHex(dec) {
  return (dec + Math.pow(16, 6)).toString(16).substr(-6)
}

또한 CSS에서 색상 데이터 유형 으로 사용하기 위해 10 진수에서 16 진수로 변환 하려는 경우 10 진수에서 RGB 값을 추출하고 rgb ()를 사용하는 것이 좋습니다 .

예를 들어 ( JSFiddle ) :

let c = 4210330 // your color in decimal format
let rgb = [(c & 0xff0000) >> 16,  (c & 0x00ff00) >> 8,  (c & 0x0000ff)]

// Vanilla JS:
document..getElementById('some-element').style.color = 'rgb(' + rgb + ')'
// jQuery:
$('#some-element').css('color', 'rgb(' + rgb + ')')

#some-elementCSS color속성을로 설정 합니다 rgb(64, 62, 154).


10

설정된 문자 수로 제한 / 채우기 :

function decimalToHex(decimal, chars) {
    return (decimal + Math.pow(16, chars)).toString(16).slice(-chars).toUpperCase();
}

2
이것은 숫자를 문자열 16 진수로 변환하고 0을 선행하는 패드로 변환합니다. 이것은 아름답습니다!
고든

10

정리 된 ECMAScript 6 버전은 다음과 같습니다.

const convert = {
  bin2dec : s => parseInt(s, 2).toString(10),
  bin2hex : s => parseInt(s, 2).toString(16),
  dec2bin : s => parseInt(s, 10).toString(2),
  dec2hex : s => parseInt(s, 10).toString(16),
  hex2bin : s => parseInt(s, 16).toString(2),
  hex2dec : s => parseInt(s, 16).toString(10)
};

convert.bin2dec('111'); // '7'
convert.dec2hex('42');  // '2a'
convert.hex2bin('f8');  // '11111000'
convert.dec2bin('22');  // '10110'

@HypersoftSystems에 대한 강한 의견 불일치로, 환경이나 상황에 따라 여유가 없다면 ES6을 사용하십시오. 모든 스크립트를 레거시 bootleg 인터프리터에서 실행할 필요는 없으며 babel도 이유가 있습니다. 마지막으로 ES6는 알고 있으면 더 읽기 쉽습니다. 그것은 표준 JS 답변을 제공하면 더 많은 사람들에게 도움이 될 수 있지만 이전 JS 버전에 대한 다른 답변이 있다는 것을 고려할 때 ES6 답변을 얻는 것이 유익하다는 것입니다.
WiR3D

의견은 사실을 나타내지 않으므로 "인수"는 유효하지 않습니다. @ WiR3D
Hypersoft 시스템

@HypersoftSystems 귀하의 의견이 동일하고 대부분의 최신 응용 프로그램에서 유효하지 않은 컨텍스트로 컨텍스트를 제한하기 때문에 귀하만큼 유효합니다.
WiR3D

사용자 오류 : "의견있는대로", "아마도"그리고 "가장"
Hypersoft Systems 2007

9
function dec2hex(i)
{
  var result = "0000";
  if      (i >= 0    && i <= 15)    { result = "000" + i.toString(16); }
  else if (i >= 16   && i <= 255)   { result = "00"  + i.toString(16); }
  else if (i >= 256  && i <= 4095)  { result = "0"   + i.toString(16); }
  else if (i >= 4096 && i <= 65535) { result =         i.toString(16); }
  return result
}

1
+1 감사합니다! CSS로 작업 할 때 toString (16)이 중요하므로 FF0000과 같은 결과를 얻을 수 있습니다.
Tyler Egeto

7
css (또는 CSS 스타일 색상 사양을 허용하는 svg)로 작업 할 때 color: rgb(r,g,b)rg 및 b가 10 진수 인 곳에 작성하여 전체 문제를 회피 할 수 있습니다 .
telent February

1
해야합니다function decimalToHexString(i) { var result = "00"; if (i >= 0 && i <= 15) { result += "000" + i.toString(16); } else if (i >= 16 && i <= 255) { result += "00" + i.toString(16); } else if (i >= 256 && i <= 4095) { result += "0" + i.toString(16); } else if (i >= 4096 && i <= 65535) { result += i.toString(16); } return result }
Aykut Çevik

9

숫자를 RGBA 색상 값의 16 진수 표현으로 변환하려면 여기에서 몇 가지 팁을 가장 유용하게 조합 한 것으로 나타났습니다.

function toHexString(n) {
    if(n < 0) {
        n = 0xFFFFFFFF + n + 1;
    }
    return "0x" + ("00000000" + n.toString(16).toUpperCase()).substr(-8);
}

8

AFAIK 주석 57807 은 잘못되었으며 다음과 같아야합니다. var hex = Number (d) .toString (16); var hex = parseInt (d, 16) 대신에 ;

function decimalToHex(d, padding) {
    var hex = Number(d).toString(16);
    padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;

    while (hex.length < padding) {
        hex = "0" + hex;
    }

    return hex;
}

6

그리고 숫자가 음수이면?

여기 내 버전이 있습니다.

function hexdec (hex_string) {
    hex_string=((hex_string.charAt(1)!='X' && hex_string.charAt(1)!='x')?hex_string='0X'+hex_string : hex_string);
    hex_string=(hex_string.charAt(2)<8 ? hex_string =hex_string-0x00000000 : hex_string=hex_string-0xFFFFFFFF-1);
    return parseInt(hex_string, 10);
}

5

꽤 큰 루프에서 16 진수 문자열로 변환하고 있으므로 가장 빠른 것을 찾기 위해 여러 가지 기술을 시도했습니다. 내 요구 사항은 결과적으로 고정 길이 문자열을 가져야하고 음수 값을 올바르게 인코딩해야합니다 (-1 => ff..f).

.toString(16)제대로 인코딩하려면 음수 값이 필요했기 때문에 Simple 이 작동하지 않았습니다. 다음 코드는 1-2 바이트 값에서 지금까지 테스트 한 것 중 가장 빠릅니다 ( symbols얻고 싶은 출력 기호의 수, 즉 4 바이트 정수의 경우 8과 동일해야 함).

var hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
function getHexRepresentation(num, symbols) {
    var result = '';
    while (symbols--) {
        result = hex[num & 0xF] + result;
        num >>= 4;
    }
    return result;
}

.toString(16)1-2 바이트 숫자 보다 빠르며 더 큰 숫자 ( symbols> = 6 일 때)에서 느리게 수행 되지만 음수 값을 올바르게 인코딩하는 메소드보다 성능이 뛰어납니다.


5

허용되는 답변에서 알 수 있듯이 10 진수를 16 진수로 변환하는 가장 쉬운 방법은 var hex = dec.toString(16)입니다. 그러나 문자열 표현이 "12".toString(16)올바르게 작동하도록 문자열 변환을 추가하는 것이 좋습니다.

// Avoids a hard-to-track-down bug by returning `c` instead of `12`
(+"12").toString(16);

프로세스를 되돌리려면 더 짧은 솔루션을 아래에서 사용할 수도 있습니다.

var dec = +("0x" + hex);

Chrome 및 Firefox에서는 속도가 느리지 만 Opera에서는 속도가 훨씬 빠릅니다. http://jsperf.com/hex-to-dec을 참조하십시오 .


5

JavaScript에서 십진수를 16 진수로 변환하는 방법

함수와 배열이 엉망이 아닌 잔인하게 깨끗하고 단순한 10 진수를 16 진수로 변환 할 수 없었습니다 ... 그래서 직접 만들어야했습니다.

function DecToHex(decimal) { // Data (decimal)

    length = -1;    // Base string length
    string = '';    // Source 'string'

    characters = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ]; // character array

    do { // Grab each nibble in reverse order because JavaScript has no unsigned left shift

        string += characters[decimal & 0xF];   // Mask byte, get that character
        ++length;                              // Increment to length of string

    } while (decimal >>>= 4); // For next character shift right 4 bits, or break on 0

    decimal += 'x'; // Convert that 0 into a hex prefix string -> '0x'

    do
        decimal += string[length];
    while (length--); // Flip string forwards, with the prefixed '0x'

    return (decimal); // return (hexadecimal);
}

/* Original: */

D = 3678;    // Data (decimal)
C = 0xF;    // Check
A = D;        // Accumulate
B = -1;        // Base string length
S = '';        // Source 'string'
H = '0x';    // Destination 'string'

do {
    ++B;
    A& = C;

    switch(A) {
        case 0xA: A='A'
        break;

        case 0xB: A='B'
        break;

        case 0xC: A='C'
        break;

        case 0xD: A='D'
        break;

        case 0xE: A='E'
        break;

        case 0xF: A='F'
        break;

        A = (A);
    }
    S += A;

    D >>>= 0x04;
    A = D;
} while(D)

do
    H += S[B];
while (B--)

S = B = A = C = D; // Zero out variables
alert(H);    // H: holds hexadecimal equivalent

5
오 마이 .. 이건 정말 끔찍하고 끔찍한 방법입니다. 솔직히 : 줄 바꿈과 들여 쓰기에 어떤 문제가 있습니까? 단일 문자 변수? 정말?
빅터 슈뢰더

1
수정했습니다. 이 방법은 끔찍한가요? 그리고 더 나은 스타일입니까? 나는 원래는 ... 가끔 꽤 바보가 될 수 문자처럼 철자가 "그대로"매 단계를 이해하기 쉬울 것이라고 생각
JonLikeSquirrel

4
죄송합니다. 그래도 여전히 끔찍합니다. 코드는 여전히 많은 비효율적 인 루프를 사용하며 다른 문제 중에서도 전역 네임 스페이스를 오염시키고 있습니다. 이 접근 방식 자체는 간단한 함수 호출로 수행 할 수있는 작업에 무리가 있습니다. JS에서 코딩 스타일을 개선하려면 w3.org/wiki/JavaScript_best_practicesgoogle.github.io/styleguide/javascriptguide.xml 과 같은 자료를 읽어 보는 것이 좋습니다 . 주제에 대한 구글.
Victor Schröder

1
Chrome에서 속도 테스트를 수행했으며 과잉 기능은 .toString (16)보다 약 30 % 빠르며 Firefox에서는 내 기능이 .toString (16)보다 40 % 느립니다 ... Chrome은 과도한 루프가 더 효율적임을 증명합니다 Firefox는 브라우저 기본 .toString (16) 함수보다 많은 반면, Firefox는 더 많은 사람들이 Chrome을 선호하는 이유를 입증합니다. 아니면 거꾸로입니까? 언젠가 Chrome이 더 빠른 .toString (16)으로 업데이트되어 두 경우 모두 잘못 될 수 있습니다! 어느 쪽이든 내가 완전히 틀리지 않았고, 당신이 완전히 옳지는 않습니다. 내 자아를 제쳐두고, 나는 적어도 30 %의 포인트를 얻습니다. ;)
JonLikeSquirrel

2
단일 문자를 포함하는 문자열 배열을 선언 할 필요는 없습니다. 문자열을 선언하십시오. 대괄호를 사용하여 배열에서와 마찬가지로 문자열에서 문자를 가져올 수 있습니다.
David Spector

3

요약하면;

function toHex(i, pad) {

  if (typeof(pad) === 'undefined' || pad === null) {
    pad = 2;
  } 

  var strToParse = i.toString(16);

  while (strToParse.length < pad) {
    strToParse = "0" + strToParse;
  }

  var finalVal =  parseInt(strToParse, 16);

  if ( finalVal < 0 ) {
    finalVal = 0xFFFFFFFF + finalVal + 1;
  }

  return finalVal;
}

그러나 마지막에 정수로 다시 변환 할 필요가없는 경우 (예 : 색상) 값이 음수가 아닌지 확인하면 충분합니다.


2

음수인지 양수인지를 확인하지 않고 2의 보수 (음수 포함)를 사용하는 명확한 대답을 찾지 못했습니다. 이를 위해 솔루션을 1 바이트로 보여줍니다.

((0xFF + number +1) & 0x0FF).toString(16);

이 명령어는 임의의 숫자 바이트로 사용할 수 FF있으며 각 위치에 추가해야 합니다. 예를 들어, 2 바이트로 :

((0xFFFF + number +1) & 0x0FFFF).toString(16);

배열 정수를 문자열 16 진으로 캐스트하려면 다음을 수행하십시오.

s = "";
for(var i = 0; i < arrayNumber.length; ++i) {
    s += ((0xFF + arrayNumber[i] +1) & 0x0FF).toString(16);
}

2

'전체'JavaScript 또는 CSS 표현으로 변환하려는 경우 다음과 같은 것을 사용할 수 있습니다.

  numToHex = function(num) {
    var r=((0xff0000&num)>>16).toString(16),
        g=((0x00ff00&num)>>8).toString(16),
        b=(0x0000ff&num).toString(16);
    if (r.length==1) { r = '0'+r; }
    if (g.length==1) { g = '0'+g; }
    if (b.length==1) { b = '0'+b; }
    return '0x'+r+g+b;                 // ('#' instead of'0x' for CSS)
  };

  var dec = 5974678;
  console.log( numToHex(dec) );        // 0x5b2a96


1

큰 정수, 즉 Number.MAX_SAFE_INTEGER-9007199254740991보다 큰 숫자를 변환하려는 경우 다음 코드를 사용할 수 있습니다

const hugeNumber = "9007199254740991873839" // Make sure its in String
const hexOfHugeNumber = BigInt(hugeNumber).toString(16);
console.log(hexOfHugeNumber)


1

이것은 Prestaul과 Tod의 솔루션을 기반으로합니다. 그러나 이것은 변수의 다양한 크기를 설명하는 일반화입니다 (예 : 마이크로 컨트롤러 직렬 로그에서 서명 된 값 구문 분석).

function decimalToPaddedHexString(number, bitsize)
{ 
  let byteCount = Math.ceil(bitsize/8);
  let maxBinValue = Math.pow(2, bitsize)-1;

  /* In node.js this function fails for bitsize above 32bits */
  if (bitsize > 32)
    throw "number above maximum value";

  /* Conversion to unsigned form based on  */
  if (number < 0)
    number = maxBinValue + number + 1;

  return "0x"+(number >>> 0).toString(16).toUpperCase().padStart(byteCount*2, '0');
}

테스트 스크립트 :

for (let n = 0 ; n < 64 ; n++ ) { 
     let s=decimalToPaddedHexString(-1, n); 
     console.log(`decimalToPaddedHexString(-1,${(n+"").padStart(2)}) = ${s.padStart(10)} = ${("0b"+parseInt(s).toString(2)).padStart(34)}`);
   }

시험 결과:

decimalToPaddedHexString(-1, 0) =        0x0 =                                0b0
decimalToPaddedHexString(-1, 1) =       0x01 =                                0b1
decimalToPaddedHexString(-1, 2) =       0x03 =                               0b11
decimalToPaddedHexString(-1, 3) =       0x07 =                              0b111
decimalToPaddedHexString(-1, 4) =       0x0F =                             0b1111
decimalToPaddedHexString(-1, 5) =       0x1F =                            0b11111
decimalToPaddedHexString(-1, 6) =       0x3F =                           0b111111
decimalToPaddedHexString(-1, 7) =       0x7F =                          0b1111111
decimalToPaddedHexString(-1, 8) =       0xFF =                         0b11111111
decimalToPaddedHexString(-1, 9) =     0x01FF =                        0b111111111
decimalToPaddedHexString(-1,10) =     0x03FF =                       0b1111111111
decimalToPaddedHexString(-1,11) =     0x07FF =                      0b11111111111
decimalToPaddedHexString(-1,12) =     0x0FFF =                     0b111111111111
decimalToPaddedHexString(-1,13) =     0x1FFF =                    0b1111111111111
decimalToPaddedHexString(-1,14) =     0x3FFF =                   0b11111111111111
decimalToPaddedHexString(-1,15) =     0x7FFF =                  0b111111111111111
decimalToPaddedHexString(-1,16) =     0xFFFF =                 0b1111111111111111
decimalToPaddedHexString(-1,17) =   0x01FFFF =                0b11111111111111111
decimalToPaddedHexString(-1,18) =   0x03FFFF =               0b111111111111111111
decimalToPaddedHexString(-1,19) =   0x07FFFF =              0b1111111111111111111
decimalToPaddedHexString(-1,20) =   0x0FFFFF =             0b11111111111111111111
decimalToPaddedHexString(-1,21) =   0x1FFFFF =            0b111111111111111111111
decimalToPaddedHexString(-1,22) =   0x3FFFFF =           0b1111111111111111111111
decimalToPaddedHexString(-1,23) =   0x7FFFFF =          0b11111111111111111111111
decimalToPaddedHexString(-1,24) =   0xFFFFFF =         0b111111111111111111111111
decimalToPaddedHexString(-1,25) = 0x01FFFFFF =        0b1111111111111111111111111
decimalToPaddedHexString(-1,26) = 0x03FFFFFF =       0b11111111111111111111111111
decimalToPaddedHexString(-1,27) = 0x07FFFFFF =      0b111111111111111111111111111
decimalToPaddedHexString(-1,28) = 0x0FFFFFFF =     0b1111111111111111111111111111
decimalToPaddedHexString(-1,29) = 0x1FFFFFFF =    0b11111111111111111111111111111
decimalToPaddedHexString(-1,30) = 0x3FFFFFFF =   0b111111111111111111111111111111
decimalToPaddedHexString(-1,31) = 0x7FFFFFFF =  0b1111111111111111111111111111111
decimalToPaddedHexString(-1,32) = 0xFFFFFFFF = 0b11111111111111111111111111111111
Thrown: 'number above maximum value'

참고 : 왜 32 비트 이상에서 실패하는지 잘 모르겠습니다.


-3

내 해결책은 다음과 같습니다.

hex = function(number) {
  return '0x' + Math.abs(number).toString(16);
}

질문은 "자바 스크립트에서 10 진수를 16 진수로 변환하는 방법" 이라고 말합니다 . 이 질문은 16 진 문자열이 0x 접두사로 시작해야한다고 지정하지 않지만 코드를 작성하는 사람은 16 진 코드프로그래밍 방식 식별자기타 숫자 (1234는 16 진, 10 진수 또는 심지어 8 진).

따라서 스크립트 작성을 위해이 질문에 올바르게 대답하려면 0x 접두사를 추가해야합니다.

Math.abs (N) 함수는 음수를 양수로 변환하며, 보너스로 누군가 누군가가 나무 칩퍼를 통해 그것을 실행하는 것처럼 보이지 않습니다.

내가 원했던 대답은 필드 너비 지정자를 가졌으므로 예를 들어 8/16/32/64 비트 값을 16 진수 편집 응용 프로그램에 나열된 방식으로 표시 할 수 있습니다. 그것은 실제적이고 정답입니다.


1
일반적인 코딩 실습에서 문자로 시작하는 영숫자 시퀀스는 숫자가 아닙니다. 예를 들면 : ABCDEF012345678은 지구상의 거의 모든 코딩 언어에서 유효한 식별자입니다.
Hypersoft Systems 2011

1
아, 그리고 0x 접두사는 자바 스크립트에 문제가되지 않습니다 Number('0xFF') === 255;. 역 작업을 원하는 모든 사람들에게.
Hypersoft Systems
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.