JavaScript で 10 進数の値を 16 進数に変換するにはどうすればよいですか?
29 に答える
次を使用して、数値を 16 進数文字列に変換します。
hexString = yourNumber.toString(16);
そして、プロセスを次のように逆にします。
yourNumber = parseInt(hexString, 16);
以下のコードは、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()
}
For completeness, if you want the two's-complement hexadecimal representation of a negative number, you can use the zero-fill-right shift >>>
operator. For instance:
> (-1).toString(16)
"-1"
> ((-2)>>>0).toString(16)
"fffffffe"
There is however one limitation: JavaScript bitwise operators treat their operands as a sequence of 32 bits, that is, you get the 32-bits two's complement.
パディングあり:
function dec2hex(i) {
return (i+0x10000).toString(16).substr(-4).toUpperCase();
}
受け入れられた回答では、返された 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」を数値として変数に入れると、取得できるのは「3」だけです。これは、小数部分にアクセスするには、数値に 10 (IE:10.0) を繰り返し掛ける必要があるためです。別の言い方をすれば、0xF の16 進値により、浮動小数点値が AND 演算される前に整数に変換され、ピリオドの後ろのすべてが削除されます。値を全体として取得するのではなく (例: 3.14159265)、浮動小数点値と 0xF 値の AND をとります。
したがって、この場合の最善の方法は、3.14159265 を文字列に変換してから、文字列を変換することです。上記により、値の先頭のマイナス記号が 0x26 になるだけなので、負数の変換も容易になります。
だから私がしたことは、変数に数値が含まれていることを判断することでした-それを文字列に変換し、文字列を変換するだけです。これは、サーバー側で着信文字列を unhex し、着信情報が数値であることを確認する必要があることを意味します。数字の前に「#」、戻ってきた文字列の前に「A」を付けるだけで簡単にできます。toHex() 関数を参照してください。
楽しむ!
もう 1 年、多くのことを考えた結果、「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() 関数を含めることだけです。
ループなし:
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);
}
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);
}
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;
}
そして、数が負の場合は?
これが私のバージョンです。
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);
}
受け入れられた回答が述べているように、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を参照してください。
かなり大きなループで 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;
}
1 ~ 2 バイトの数値よりも高速に実行.toString(16)
され、大きな数値 ( symbols
>= 6 の場合) では低速ですが、負の値を適切にエンコードするメソッドよりも優れたパフォーマンスを発揮します。
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;
}
ただし、最後に整数に戻す必要がない場合 (つまり、色の場合)、値が負でないことを確認するだけで十分です。