JavaScriptで10進数を16進数に変換する方法


1479

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


7
文字列表現から始めているという警告だけですが、16進数への変換の一部として数値に変換すると、非常に簡単に精度が失われます。danvk.org/wp/2012-01-20/…を参照してください。
studgeek 2013年

この機能はまさにあなたが必要とするものです
Mohammad Musavi '

回答:


2474

次のようにして、数値を16進文字列に変換します。

hexString = yourNumber.toString(16);

そして、プロセスを逆にします:

yourNumber = parseInt(hexString, 16);

42
この場合、yourNumは16進文字列です。例(255).toString(16)== 'ff' && parseInt( 'ff'、16)== 255
予告

8
@forsteでは、この手法を使用して、javascriptの数値(ECMAスクリプトではDoubleであるNumberオブジェクト)を16進数に変換したり、元に戻したりしても、「精度が失われる」ことはありません。リンクした質問は、特にDoubleに収まらないほど大きな数値を参照しています(そのため、質問の文字列表現です)。あなたが数を持っているなら、これはうまくいくでしょう。JavaScriptのNumberオブジェクト(Double)にするには大きすぎるものがある場合は、別のものを見つける必要があります。
Prestaul

12
@デレク、私は不必要な括弧を容認することを許さない心理的な問題を抱えています... @ everyone-else yourNumberは変数です。数値リテラルを使用する場合は、のようにする必要がありますが、数値(45).toString(16)をハードコーディングしている場合は、16進文字列としてそれを記述してください... (45).toString(16)常に等しい'2d'ので、CPUを無駄にしないでくださいそれを理解するためのサイクル。
Prestaul

21
@Prestaul「それを理解するためにCPUサイクルを無駄にしないでください」-これは時期尚早の最適化と呼ばれます。JavaScriptが286で実行されていない限り、オーバーヘッドの問題は疑問です。さらに、「45」はプログラマーが認識できる必要があるマジックナンバー(秒単位のタイムアウト期間など)かもしれませんが、「2d」はそれを誰が認識するのでしょうか。
Dejay Clayton 2014

47
:あなたは括弧気に入らない場合、あなただけの余分なドットを使用することができます42..toString(16)
トーマス・ワトソン

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の補数ですか?
ジュリアン

2
JavaScriptはすべての32ビットビットフィールドを符号なし数値として表すことができるため、通常、この変換は必要ありません(Number.MAX_SAFE_INTEGERを参照)。:符号なしへの変換のように書くことができるのと同じ理由number = 0x100000000 + number;
ヨハネスMatokic

3
私の以前のコメントに関する短いメモ:16進表記はNumber.MAX_SAFE_INTEGERまでの数で機能するはずですが、これはビット単位の演算(32ビットカラーの作成によく使用される)では成り立ちません。ビット演算の結果は常に符号付き32ビット整数です。したがって、ビットごとの結果> = 2 ^ 31は負で、0x100000000 | 0 === 0
ヨハネスMatokic

25
>>>演算子を使用して、数値を符号なし表現に変換できます(例:((-3253) >>> 0).toString(16)return)"fffff34b"
csharpfolk 2015

1
+1便利な追加ですが、数値を別の表記に変換する場合、すべての数値はすでに「通常」正であるか、そうでなければ負の結果が必要です。
カールスミス

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 2010年

3
また、フロートにも問題がありますが、Math.round()を配置することで修正されました。(+1付き)
マイケル-クレイシャーキーは

私は配列( '255,0,55'など)から数値を「プル」し、.toString(16)が機能しませんでした。私が得たものはすべて同じ数でした!フロントに「ナンバー」機能を追加し、動作しました!約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); }
ロリ

2
それを拡張することはそれほど難しくありません、あなたはそこで.slice(-number)で最後の桁を切り落としています。前にゼロを追加すると、問題なく動作します。
1

19
ES6 const hex = d => Number(d).toString(16).padStart(2, '0')😁
ニンファム

39

完全を期すために、負の数の2の補数の 16進数表現が必要な場合は、右詰めゼロシフト>>>演算子を使用できます。例えば:

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

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

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


2
これは、この質問に対する断然最も貴重な答えです:)
albertjan

C# number to hexadecimalは異なる結果を生み出していたため、すべての質問を掘り下げJavascript number to hexadecimalます。Javascriptに負の数の問題があるようです。この答えが問題の解決策のようです。
goamn

これは非常に役に立ちました。ありがとうございます。私はこれをRGBカラーに使用していたので、24ビットバリアントを取得するには、最初の2文字のチョップ(追加のFF)((-2)>>>0).toString(16).substring(2)
antonyh


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/...
ポンTrizkit

16

受け入れられた回答では、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ビットワードとして保存されているため、numHexコードを変更して64ビットワードを取得しようとしました。しかし、それはできないことがわかりました。"3.14159265" AS A NUMBERを変数に入れた場合、得られるのは "3"だけです。これは、小数部分にアクセスするには、数値に10(IE:10.0)を繰り返し掛けることによってのみアクセスできるためです。または別の言い方をすれば、16進値 0xFにより、浮動小数点値がAND 演算される前に整数に変換され、ピリオドの後ろのすべてが削除されます。値を全体として(つまり:3.14159265)取り、浮動小数点値と0xF値の論理積をとるのではなく。

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

だから私がやったことは、変数に数値が含まれていることを決定することでした-それを文字列に変換して文字列を変換するだけです。これは、サーバー側では、受信文字列の16進数をunhexしてから、受信情報が数値であることを確認する必要があることを誰もが知っていることを意味しています。数字の前に「#」を、戻ってくる文字列の前に「A」を付けるだけで簡単にできます。toHex()関数を参照してください。

楽しんで!

別の年と多くの考えの後、私は「toHex」関数(そして「fromHex」関数も持っている)が本当に改良される必要があると決めました。全体の質問は「これをもっと効率的にするにはどうすればよいですか?」to / from 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;
}

これは非常に高速な関数であり、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).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"を検索し、受信した情報がまだ文字列でない場合は文字列に変換します。どうして文字列にならないのかわかりませんが、念のため-チェックします。次に、関数は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;

?>

JavaScriptがtoString()関数に関してどのように機能するかにより、以前は問題を引き起こしていたこれらの問題をすべて取り除くことができます。すべての文字列と数値を簡単に変換できるようになりました。さらに、オブジェクトなどによって、JavaScript自体によってエラーが生成されます。私はこれが得られるのと同じくらい良いと信じています。残っている唯一の改善点は、W3CがJavaScriptにtoHex()およびfromHex()関数を含めるだけです。


ここでやらなければならない仕事はまだあると思います... たとえば、おそらくあなたが望むものではないif( s.substr(0,2)前にif (typeof s != "string")。私は戻っていたこと(私はどちらか期待したものではなかったtoHex(0x1f635)提供します"0x313238353635")。これ以上調査していません。
ruffin 2017年

私はあなたが間違っていると思います。あなたの例は、文字列ではなく数値である16進数文字列を使用しています。したがって、1f635はそのままの状態で出力されます。あなたが「0x1f635」を入れなければならなかったならば、それは異なって出てきただろう。(つまり、ルーチンは、ルーチンに送信した16進数を返しただけです。):-)
Mark Manning

最初のポイントは、文字列以外でsubstrtoLowerCaseを使用できないことです...したがって、typeof必要になるのが早くなるか、または文字列以外ですぐtoHexにスローすることが予想される場合は、typeofチェックを完全に削除する必要があります。理にかなっていますか?つまり、ここでコードを編集せずに使用してを呼び出すとtoHex(0x1f635)、が取得されUncaught TypeError: s.substr is not a functionます。文字列キャストを先に移動した場合、そのとおりです。数値は最初に10進数にキャストされ、おそらく横向きになります。もちろんこれはs、が文字列でない場合、ここでは単純なキャストを実行できないことを意味します。
ruffin

実際、XPではこれは問題なく動作します。Javascriptが型キャストされるようにするJavascriptへの多くの更新がありました。これは例外をスローします。XPではjusrが動作します。少なくとも私にとっては。タイプキャストの世界では、 "if(typeof s ==" string "&& s.substr(0,2)==" 0x "){return s;}"を置くのが適切です。しかし、ox1f635はまだ文字列ではありません。:-)
マーク・マニング


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進数に変換し、先頭にゼロを埋めます。これは美しいことです。
ゴードン

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を使用してください。すべてのスクリプトをレガシーブートレグインタープリターで実行する必要があるわけではなく、理由のためにbabelも存在します。そして最後に、あなたがそれを知っていれば、ES6ははるかに読みやすくなります。つまり、標準のJS回答を提供することはより多くの人々に役立つ可能性がありますが、古いJSバージョンには他の回答があることを考えると、ES6回答があることは有益なだけであり、「これは私が当時それをやった方法です」という言葉は絶対に必要ありません。
WiR3D 2018

意見は事実ではないので、あなたの「議論」は無効です。@ WiR3D
Hypersoft Systems

@HypersoftSystemsそれはあなたの意見と同じくらい妥当であり、あなたの意見も同じように考えられており、コンテキストを最新のほとんどのアプリケーションではおそらく無効なコンテキストに制限しているからです。
WiR3D

ユーザーエラー:「意見どおり」、「おそらく」、「ほとんど」。
Hypersoft Systems

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進数であると書くことで、問題全体を回避できます。
テレント

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

Google ChromeとFirefoxでは遅いようですが、Operaでは著しく高速です。http://jsperf.com/hex-to-decを参照してください。


5

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

5
あら、これは本当にひどい、恐ろしい方法で、醜いコーディングスタイルで行われています。正直なところ、改行とインデントの何が問題になっていますか?1文字の変数?本当に?
ビクターシュレーダー

1
改訂しました。この方法は恐ろしいですか?そして、スタイルは良いですか?私は当初、文字でそのように「文字通り」綴られたすべての単一のステップで理解する方が簡単だと思っていました...時々私はかなり愚かなことができます
JonLikeSquirrel

4
すみません、はい、それでもひどいです。あなたのコードはまだ多くの非効率的なループを使用しており、他の問題の中でも特にグローバル名前空間を汚染しています。アプローチ自体は、単純な関数呼び出しで実行できるタスクには過剰です。JSでコーディングスタイルを改善したい場合は、w3.org / wiki/ JavaScript_best_practicesgoogle.github.io/styleguide/javascriptguide.xmlなどの資料を読むことを強くお勧めします。主題についてググってください。
VictorSchröder2016

1
私はChromeで速度テストを行いましたが、私のオーバーキル関数は.toString(16)よりも約30%高速ですが、Firefoxでは私の関数は.toString(16)よりも40%遅いです... Chromeは私の過剰なループがより効率的であることを証明していますブラウザのネイティブの.toString(16)関数よりも、Firefoxはより多くの人々がChromeを好む理由を証明しています。それとも逆ですか?ある日、Chromeがより高速な.toString(16)に更新されることもあり、どちらの場合も正しくありません!どちらにしても、私は完全に間違っているわけではなく、あなたが完全に正しいわけではありません。私のエゴは別として、私はそれの少なくとも30%をあなたのポイントを得ます。;)
JonLikeSquirrel 2016

2
単一の文字をそれぞれ含む文字列の配列を宣言する必要はありません。文字列を宣言するだけです。角かっこを使用すると、配列と同じように文字列から文字を取得できます。
デビッドスペクター

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

これは、プレスタウルとトッドのソリューションに基づいています。ただし、これは変数のさまざまなサイズを考慮した一般化です(たとえば、マイクロコントローラーのシリアルログからの符号付き値の解析)。

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

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

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

Math.abs(N)関数は、負数を正数に変換します。おまけとして、誰かがウッドチッパーを実行したようには見えません。

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


1
一般的なコーディングの慣例では、文字で始まる英数字のシーケンスは数字ではありません。例:ABCDEF012345678は、地球上のほとんどすべてのコーディング言語で有効な識別子です。
Hypersoft Systems '20

1
ああ、そして0xプレフィックスはjavascriptの問題ではありません Number('0xFF') === 255;。逆の操作をしたいすべての人にとって。
Hypersoft Systems '20
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.