JavaScriptで10進数値を16進数に変換するにはどうすればよいですか?
JavaScriptで10進数値を16進数に変換するにはどうすればよいですか?
回答:
次のようにして、数値を16進文字列に変換します。
hexString = yourNumber.toString(16);
そして、プロセスを逆にします:
yourNumber = parseInt(hexString, 16);
yourNumber
は変数です。数値リテラルを使用する場合は、のようにする必要がありますが、数値(45).toString(16)
をハードコーディングしている場合は、16進文字列としてそれを記述してください... (45).toString(16)
常に等しい'2d'
ので、CPUを無駄にしないでくださいそれを理解するためのサイクル。
42..toString(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));
number = 0x100000000 + number;
>>>
演算子を使用して、数値を符号なし表現に変換できます(例:((-3253) >>> 0).toString(16)
return)"fffff34b"
。
+1
便利な追加ですが、数値を別の表記に変換する場合、すべての数値はすでに「通常」正であるか、そうでなければ負の結果が必要です。
以下のコードは、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 hexRep(number, width) { return (number+Math.pow(16, precision)).toString(16).slice(-width); }
const hex = d => Number(d).toString(16).padStart(2, '0')
😁
完全を期すために、負の数の2の補数の 16進数表現が必要な場合は、右詰めゼロシフト>>>
演算子を使用できます。例えば:
> (-1).toString(16)
"-1"
> ((-2)>>>0).toString(16)
"fffffffe"
ただし、1つの制限があります。JavaScriptのビット演算子は、オペランドを32ビットのシーケンスとして扱います。つまり、32ビットの2の補数を取得します。
C# number to hexadecimal
は異なる結果を生み出していたため、すべての質問を掘り下げJavascript number to hexadecimal
ます。Javascriptに負の数の問題があるようです。この答えが問題の解決策のようです。
((-2)>>>0).toString(16).substring(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ビットワードとして保存されているため、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"
)。これ以上調査していません。
substr
&toLowerCase
を使用できないことです...したがって、typeof
必要になるのが早くなるか、または文字列以外ですぐtoHex
にスローすることが予想される場合は、typeof
チェックを完全に削除する必要があります。理にかなっていますか?つまり、ここでコードを編集せずに使用してを呼び出すとtoHex(0x1f635)
、が取得されUncaught TypeError: s.substr is not a function
ます。文字列キャストを先に移動した場合、そのとおりです。数値は最初に10進数にキャストされ、おそらく横向きになります。もちろんこれはs
、が文字列でない場合、ここでは単純なキャストを実行できないことを意味します。
興味のある人のために、ここに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-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 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
}
color: rgb(r,g,b)
、rgとbが10進数であると書くことで、問題全体を回避できます。
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 }
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);
}
かなり大きなループで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の場合)で低速になりますが、負の値を適切にエンコードするメソッドよりもパフォーマンスが優れています。
受け入れられた回答が述べているように、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();
これは、プレスタウルとトッドのソリューションに基づいています。ただし、これは変数のさまざまなサイズを考慮した一般化です(たとえば、マイクロコントローラーのシリアルログからの符号付き値の解析)。
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ビットサイズを超えると失敗する理由がわかりません
これが私の解決策です:
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ビット値を表示することができます。それが実際の正解です。
Number('0xFF') === 255;
。逆の操作をしたいすべての人にとって。