質問

JavaScript で 10 進数値を同等の 16 進数値に変換するにはどうすればよいですか?

役に立ちましたか?

解決

次のコマンドを使用して、数値を 16 進文字列に変換します。

hexString = yourNumber.toString(16);

そして、次のようにしてプロセスを逆にします。

yourNumber = parseInt(hexString, 16);

他のヒント

ビット フィールドや 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));

以下のコードは、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;
}
function toHex(d) {
    return  ("0"+(Number(d).toString(16))).slice(-2).toUpperCase()
}

パディングあり:

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

完了のために、必要な場合は、 2の補数 負の数を 16 進数で表現する場合は、 ゼロフィル右シフト >>> オペレーター. 。例えば:

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

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

ただし、制限が 1 つあります。 JavaScript のビット演算子はオペランドを 32 ビットのシーケンスとして扱います。, つまり、32 ビットの 2 の補数が得られます。

ループを使用しない場合:

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++){}

これらの優れたアイデアのいくつかを組み合わせて、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);
}

受け入れられた回答では、返された 1 桁の 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);
    }
}

数値正規表現は次のものから来ていることに注意してください。 Web アプリケーションの効率を向上させる 10 個以上の便利な JavaScript 正規表現関数.

アップデート:これを何度かテストした結果、エラー (RegExp 内の二重引用符) が見つかったので、それを修正しました。しかし!かなりのテストを行い、almaz の投稿を読んだ後、負の数を機能させることができないことに気付きました。

さらに、これについて少し調べてみましたが、JavaScript の数値はすべて 64 ビット ワードとして保存されるため、64 ビット ワードを取得するように numHex コードを変更してみました。しかし、それはできないことがわかりました。「3.14159265」を数値として変数に入力すると、得られるのは「3」だけになります。これは、小数部分には繰り返し数値を 10 (IE:10.0) 倍することによってのみアクセスできるためです。別の言い方をすると、 16進数 値 0xF により、 浮動小数点 に変換される値 整数 AND 演算される前に、ピリオドの後ろにあるものはすべて削除されます。値を全体として取得するのではなく (つまり:3.14159265) との AND 演算 浮動小数点 値を 0xF 値と比較します。

したがって、この場合に行う最善の方法は、3.14159265 を あとは文字列を変換するだけです。上記の理由により、値の先頭のマイナス記号が 0x26 になるだけなので、負の数値の変換も簡単になります。

そこで私がやったのは、変数に数値が含まれているかどうかを判断することであり、それを文字列に変換し、その文字列を変換するだけです。これは、サーバー側で受信文字列の 16 進数を解除し、受信情報が数値であることを判断する必要があることを意味します。数字の前に「#」を付け、戻ってくる文字列の前に「A」を付けるだけで簡単に行うことができます。toHex() 関数を参照してください。

楽しむ!

さらに 1 年考え、よく考えた結果、「toHex」関数 (「fromHex」関数も持っています) を本当に改良する必要があると判断しました。質問全体は、「どうすればこれをより効率的に行うことができますか?」でした。私は、ヘキサデシマル関数からの間、または何かが分数部分であるかどうかを気にしないでください。同時に、分数部分が文字列に含まれることを保証する必要があると判断しました。

そこで質問は、「16 進数の文字列を扱っていることをどのようにして知ることができるのですか?」ということになりました。答えは簡単です。すでに世界中で認知されている標準の事前文字列情報を使用します。

つまり、「0x」を使用します。したがって、私の toHex 関数は、それがすでに存在するかどうかを確認し、存在する場合は、送信された文字列を返すだけです。それ以外の場合は、文字列、数値などを変換します。改訂された toHex 関数は次のとおりです。///////////////////////////////////////////////// ///////////////////// // tohex()。ASCII 文字列を 16 進数に変換します。///////////////////////////////////////////////// //////////////////////ohex(s){if(s.substr(0,2).tolowercase()== "0x ") { 戻り値;}

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

これは非常に高速な関数で、1 桁の浮動小数点数を考慮し、さらに 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) == "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」を探し、次に受信した情報が文字列でない場合は文字列に変換します。どうして文字列にならないのかわかりませんが、念のため確認してみます。次に、関数は 2 つの文字を取得し、それらを ASCII 文字に変換します。Unicode を変換したい場合は、ループを一度に 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 が JavaScript に toHex() 関数と fromHex() 関数を組み込むことだけです。

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

16 は基数で、16 進数には 16 個の値があります :-)

設定された文字数に制限/パディング:

function decimalToHex(decimal, chars) {
    return (decimal + Math.pow(16, chars)).toString(16).slice(-chars).toUpperCase();
}
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
}

数値を RGBA カラー値の 16 進数表現に変換する場合は、ここにあるいくつかのヒントを組み合わせたものが最も便利であることがわかりました。

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

私の知る限り コメント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;
}

興味のある方は、 これは、この質問に対するほとんどの回答を比較した JSFiddle です。.

そして、私が最終的に採用した方法は次のとおりです。

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

また、CSS で使用するために 10 進数から 16 進数に変換しようとしている場合は、次のことに注意してください。 カラーデータ型, の場合は、代わりに 10 進数から RGB 値を抽出して使用することをお勧めします。 RGB().

例えば ​​(JSフィドル):

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

// assuming you're using jQuery...
$("#some-element").css("color", "rgb(" + rgb + ")");

このセットは #some-elementのCSS color 財産を rgb(64, 62, 154).

以下は、トリミングされた 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'

そしてその数値が負の場合はどうなるでしょうか?

これが私のバージョンです。

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

以下のことが確認できます JsFiddle の例 または Stack Overflow JavaScript サンプル コードも同様です。

'use strict';

var convertBase = function () {

    function convertBase(baseFrom, baseTo) {
        return function (num) {
            return parseInt(num, baseFrom).toString(baseTo);

        };
    }

    // Decimal to hexadecimal
    convertBase.dec2hex = convertBase(10, 16);
    return convertBase;
}();

alert(convertBase.dec2hex('42')); // '2a'

かなり大きなループで 16 進文字列への変換を行っているため、最も高速な手法を見つけるためにいくつかの手法を試しました。私の要件は、結果として固定長の文字列を持ち、負の値を適切にエンコードすることでした (-1 => ff..f)。

単純 .toString(16) 負の値を適切にエンコードする必要があったため、私には機能しませんでした。次のコードは、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) ですが、それでも負の値を適切にエンコードするメソッドよりも優れたパフォーマンスを発揮するはずです。

受け入れられた回答が述べているように、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);

Google Chrome や Firefox では遅いようですが、Opera では大幅に高速です。見る http://jsperf.com/hex-to-dec.

JavaScriptで10進数を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

すべてを要約すると、

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の補数(負の数を含む)を使用する明確な答えは見つかりませんでした。そのために、私の解決策を 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);
}

「完全な」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

でこのようなことができます ECMAScript 6:

const toHex = num => (num).toString(16).toUpperCase();

大きな整数を変換したい場合、つまりNumber.MAX_SAFE_INTEGER -- 9007199254740991 より大きい数値の場合は、次のコードを使用できます。

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

私の解決策は次のとおりです。

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

質問には次のように書かれています。 「JavaScriptで10進数を16進数に変換する方法」. 。質問では、16 進文字列が 0x プレフィックスで始まる必要があるとは指定されていませんが、コードを書く人なら誰でも、区別するために 16 進コードに 0x が追加されることを知っておく必要があります。 16進数コード から プログラム識別子 そして 他の数字 (1234 は 16 進数、10 進数、または 8 進数にすることもできます)。

したがって、スクリプト作成の目的でこの質問に正しく答えるには、0x プレフィックスを追加する必要があります。

Math.abs(N) 関数はマイナスをプラスに変換します。おまけに、誰かが木材破砕機で実行したようには見えません。

私が望んでいた答えには、フィールド幅指定子があったはずです。これにより、たとえば 8/16/32/64 ビットの値を、16 進数編集アプリケーションでリストされるのと同じように表示できるようになります。それが実際の正しい答えです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top