Pertanyaan Bagaimana cara mengubah desimal menjadi hex dalam JavaScript?


Bagaimana Anda mengubah nilai desimal ke ekuivalen hex dalam JavaScript?


1184
2017-09-11 22:26


asal


Jawaban:


Konversikan angka ke string heksadesimal dengan:

hexString = yourNumber.toString(16);

dan membalikkan proses dengan:

yourNumber = parseInt(hexString, 16);

1988
2017-09-11 22:28



Jika Anda perlu menangani hal-hal seperti bidang bit atau warna 32-bit, maka Anda perlu berurusan dengan nomor yang ditandatangani. Fungsi javascript toString(16) akan mengembalikan angka heksa negatif yang biasanya bukan yang Anda inginkan. Fungsi ini melakukan beberapa penambahan gila untuk menjadikannya bilangan positif.

function decimalToHexString(number)
{
  if (number < 0)
  {
    number = 0xFFFFFFFF + number + 1;
  }

  return number.toString(16).toUpperCase();
}

console.log(decimalToHexString(27));
console.log(decimalToHexString(48.6));


119
2018-03-30 16:05



Kode di bawah ini akan mengubah nilai desimal menjadi heksa. Ini juga memungkinkan Anda untuk menambahkan padding ke hasil hex. jadi 0 akan menjadi 00 secara default.

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

68
2017-09-11 22:29



function toHex(d) {
    return  ("0"+(Number(d).toString(16))).slice(-2).toUpperCase()
}

44
2017-11-05 21:08



Dengan padding:

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

30
2017-07-13 14:29



Untuk selesai, jika Anda menginginkan dua pelengkap representasi heksadesimal dari bilangan negatif, Anda dapat menggunakan pergeseran nol-isi-kanan >>> operator. Contohnya:

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

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

Namun ada satu batasan: operator bitwise javascript memperlakukan operand mereka sebagai urutan 32 bit, yaitu, Anda mendapatkan 32-bit dua-pelengkap.


25
2018-06-14 10:59



Tanpa loop:

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

Juga tidak lebih baik untuk tidak menggunakan tes lingkaran yang harus dievaluasi misalnya, bukan:

for (var i = 0; i < hex.length; i++){}

memiliki

for (var i = 0, var j = hex.length; i < j; i++){}

16
2017-09-11 03:05



Menggabungkan beberapa ide bagus ini untuk fungsi rgb to hex (tambahkan # tempat lain untuk 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);
}

13
2017-11-15 12:44



Jawaban yang diterima tidak memperhitungkan satu digit kode hex yang dihasilkan. Ini mudah disesuaikan dengan:

   function numHex(s)
   {
      var a = s.toString(16);
      if( (a.length % 2) > 0 ){ a = "0" + a; }
      return a;
   }

dan

   function strHex(s)
   {
      var a = "";
      for( var i=0; i<s.length; i++ ){
         a = a + numHex( s.charCodeAt(i) );
         }

      return a;
   }

Saya percaya jawaban di atas telah diposting berkali-kali oleh orang lain dalam satu bentuk atau yang lain. Saya membungkus ini dalam fungsi toHex () seperti:

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

Perhatikan bahwa ekspresi reguler numerik berasal 10+ Berguna Fungsi Ekspresi Reguler JavaScript untuk meningkatkan efisiensi aplikasi web Anda.

Pembaruan: Setelah menguji hal ini beberapa kali saya menemukan kesalahan (tanda kutip ganda di RegExp), jadi saya memperbaikinya. NAMUN! Setelah sedikit pengujian dan setelah membaca posting oleh almaz - saya menyadari saya tidak bisa mendapatkan angka negatif untuk bekerja. Lebih lanjut - Saya melakukan beberapa membaca tentang ini dan karena semua nomor Javascript disimpan sebagai 64 bit kata tidak peduli apa - saya mencoba memodifikasi kode numHex untuk mendapatkan kata 64 bit. Tapi ternyata Anda tidak bisa melakukan itu. Jika Anda memasukkan "3.14159265" SEBAGAI JUMLAH ke dalam variabel - semua yang bisa Anda dapatkan adalah "3" karena bagian pecahan hanya dapat diakses dengan mengalikan angka dengan sepuluh (IE: 10.0) berulang kali. Atau dengan kata lain - nilai HEX dari 0xf menyebabkan nilai FLOATING POINT diterjemahkan ke INTEGER sebelum ANDed yang menghapus semuanya di belakang periode. Daripada mengambil nilai secara keseluruhan (yaitu: 3.14159265) dan MENGATAKAN nilai POINT FLOATING terhadap nilai 0xf. Jadi hal terbaik untuk dilakukan, dalam hal ini, adalah mengonversi 3,14159265 menjadi STRING dan kemudian hanya mengonversi string. Karena hal di atas, itu juga memudahkan untuk mengubah angka negatif karena tanda minus hanya menjadi 0x26 di depan nilai. Jadi apa yang saya lakukan adalah menentukan bahwa variabel berisi angka - cukup mengonversinya menjadi string dan mengubah string. Apa artinya ini bagi semua orang adalah bahwa di sisi server Anda perlu unhex string yang masuk dan kemudian untuk menentukan informasi yang masuk adalah numerik. Anda dapat melakukannya dengan mudah hanya dengan menambahkan "#" di depan angka dan "A" di depan string karakter yang akan kembali. Lihat fungsi toHex ().

Selamat bersenang-senang!

Setelah satu tahun lagi dan banyak pemikiran, saya memutuskan bahwa fungsi "toHex" (dan saya juga memiliki fungsi "fromHex") sangat perlu untuk dirubah. Seluruh pertanyaannya adalah, "Bagaimana saya bisa melakukan ini dengan lebih efisien?" Saya memutuskan bahwa ke / dari fungsi hex tidak boleh peduli jika sesuatu adalah bagian pecahan tetapi pada saat yang sama harus memastikan bahwa bagian pecahan termasuk dalam string. Jadi kemudian pertanyaannya menjadi, "Bagaimana Anda tahu Anda bekerja dengan string heksadesimal?". Jawabannya sederhana. Gunakan informasi pra-string standar yang sudah diakui di seluruh dunia. Dengan kata lain - gunakan "0x". Jadi sekarang fungsi toHex saya terlihat untuk melihat apakah itu sudah ada dan jika ya - itu hanya mengembalikan string yang dikirim ke sana. Jika tidak, itu mengubah string, angka, apa pun. Berikut adalah fungsi toHex yang direvisi:

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

Ini adalah fungsi yang sangat cepat yang memperhitungkan satu digit, angka floating point, dan bahkan memeriksa untuk melihat apakah orang tersebut mengirim nilai hex untuk di-hexed lagi. Ini hanya menggunakan empat panggilan fungsi dan hanya dua yang ada dalam lingkaran. Untuk un-hex nilai yang Anda gunakan:

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

Seperti fungsi toHex (), fungsi fromHex () pertama mencari "0x" dan kemudian menerjemahkan informasi yang masuk ke dalam string jika belum menjadi string. Saya tidak tahu bagaimana itu tidak akan menjadi string - tetapi berjaga-jaga - saya periksa. Fungsi kemudian berjalan, meraih dua karakter dan menerjemahkannya ke karakter ascii. Jika Anda ingin menerjemahkan unicode, Anda akan perlu mengubah loop untuk pergi dengan empat (4) karakter sekaligus. Tapi kemudian Anda juga perlu memastikan bahwa string TIDAK dibagi oleh empat. Jika ya - maka itu adalah string hex standar. (Ingat string memiliki "0x" di depannya.)

Sebuah skrip uji sederhana untuk menunjukkan bahwa -3.14159265, ketika dikonversi menjadi string, masih -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;

?>

Karena cara Javascript bekerja sehubungan dengan fungsi toString (), semua masalah tersebut dapat dihilangkan yang sebelumnya menyebabkan masalah. Sekarang semua string dan angka dapat dikonversi dengan mudah. Selanjutnya, hal-hal seperti objek akan menyebabkan kesalahan untuk di-genereasikan oleh Javascript sendiri. Saya yakin ini sama bagusnya dengan itu. Satu-satunya perbaikan yang tersisa adalah untuk W3C untuk hanya menyertakan fungsi toHex () dan fromHex () di Javascript.


11
2017-11-06 16:21