web-dev-qa-db-ja.com

JavaScriptでの16進数のフォーマット

JavaScriptで16進数を使用しています。表示のために、文字列を次のようにフォーマットします。

ffffffff-ffff-ffff
00000000-0000-01ff

(8桁)-(4桁)-(4桁)前面にゼロが埋め込まれたもの

私は任意の16進数をこの形式にフォーマットするために独自のループを作成しようとしましたが、これはすでにJavaScriptで利用できるはずです。 JavaScriptで16進数をフォーマットする組み込みの方法はありますか?

ありがとう!

22
David

私は2段階のプロセスを実行します。

1)数値を先行ゼロ付きの16桁の16進数に変換します。

var i = 12345; // your number
var h = ("000000000000000" + i.toString(16)).substr(-16);

2)ダッシュを追加する

var result = h.substr(0, 8)+'-'+h.substr(8,4)+'-'+h.substr(12,4);
54
knabar

Knabarの答えに加えて:

あなたの数が本当に完全な64ビット長である場合、javascriptには倍精度しかなく、約53ビットの精度で最高になることに注意する必要があります。例えば。

_var i = 0x89abcdef01234567; // a 64-bit constant
var h = ("000000000000000" + i.toString(16)).substr(-16); // "89abcdef01234800"
_

したがって、おそらくこれを2つの32ビット数値に分割し、一度に8桁にフォーマットする必要があります。次に、2番目の警告が発生します。JavaScriptはsigned 32ビット整数に対してビット単位の演算を実行し、このフォーマットコードは負の数を処理できません。

_var i = 0xffd2 << 16; // actually negative
var h = ("0000000" + i.toString(16)).substr(-8); // "0-2e0000"
_

16進数でフォーマットしたい数値はビット単位の操作の結果である可能性が高いため、コードを微調整して2の補数で出力することができます。

_var i = 0xffd2 << 16; // actually negative
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "ffd20000"
_

これにより、任意の正数と負数の整数部の下位32ビットの16進表現が生成されます。これはおそらくあなたが望んでいることです(およそprintf("%08x")です)。さらにいくつかのコーナーケース:

_var i = 1.5; // non-integers are rounded
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "00000001"

var i = -1.5; // rounding is towards zero
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "ffffffff"

var i = NaN; // not actually a number
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "00000000"
_
14
hexwab

ES6バージョン

function toPaddedHexString(num, len) {
    str = num.toString(16);
    return "0".repeat(len - str.length) + str;
}

var hexStr = toPaddedHexString(12345, 16);
11
Nilesh

純粋なjavascriptに関連するものはないと思いますが、フレームワークはこのメソッドを提供します。ExtJS3では、この方法で実装されます

    /**
     * Pads the left side of a string with a specified character.  This is especially useful
     * for normalizing number and date strings.  Example usage:
     * <pre><code>
var s = String.leftPad('123', 5, '0');
// s now contains the string: '00123'
     * </code></pre>
     * @param {String} string The original string
     * @param {Number} size The total length of the output string
     * @param {String} char (optional) The character with which to pad the original string (defaults to empty string " ")
     * @return {String} The padded string
     * @static
     */
    leftPad : function (val, size, ch) {
        var result = String(val);
        if(!ch) {
            ch = " ";
        }
        while (result.length < size) {
            result = ch + result;
        }
        return result;
    }
1
Saket Patel

Hexwabの回答に記載されている制限により、数値はすでに文字列の形式になっていると思います。そうでない場合は、状況に適したメカニズムを使用して、任意の長さのhex文字列(strと呼ばれる)にしてプロセスを開始します。次に:

(Array(16).join(0) + str).slice(-16).replace(/^.{8}|.{4}(?!$)/g,"$&-");
0
Adam Leggett

Stringには、padStartおよびpadEndという2つのメソッドがあります。

const num = 15;
console.log(num.toString(16).padStart(2, "0")); // "0f"
const num = 15;
console.log(num.toString(16).padEnd(2, "0")); // "f0"

リンクに関する追加情報: padStartpadEnd

0
Profesor08