Bagaimana Anda mengonversi nilai desimal ke ekuivalen heksadesimalnya dalam JavaScript?
javascript
hex
tostring
base
number-formatting
Luke Smith
sumber
sumber
Jawaban:
Konversi angka menjadi string heksadesimal dengan:
Dan membalikkan proses dengan:
sumber
yourNumber
adalah sebuah variabel. Jika Anda ingin menggunakan numerik literal maka Anda harus melakukan sesuatu seperti(45).toString(16)
, tetapi jika Anda meng-coding angka maka silakan tulis saja sebagai string hex sendiri ...(45).toString(16)
akan selalu sama'2d'
, jadi jangan buang cpu siklus untuk mencari tahu itu.42..toString(16)
Jika Anda perlu menangani hal-hal seperti bidang bit atau warna 32-bit, maka Anda harus berurusan dengan angka yang ditandatangani. Fungsi JavaScript
toString(16)
akan mengembalikan angka heksadesimal negatif yang biasanya bukan yang Anda inginkan. Fungsi ini melakukan beberapa tambahan gila untuk membuatnya menjadi angka positif.sumber
number = 0x100000000 + number;
>>>
operator untuk mengonversi angka menjadi representasi yang tidak ditandatangani, misalnya((-3253) >>> 0).toString(16)
pengembalian"fffff34b"
.+1
untuk tambahan yang bermanfaat, tetapi jika Anda mengonversi angka ke notasi yang berbeda, semua angka itu "biasanya" sudah positif, atau Anda ingin hasil negatif.Kode di bawah ini akan mengonversi nilai desimal d menjadi heksadesimal. Ini juga memungkinkan Anda untuk menambahkan bantalan ke hasil heksadesimal. Jadi 0 akan menjadi 00 secara default.
sumber
sumber
function hexRep(number, width) { return (number+Math.pow(16, precision)).toString(16).slice(-width); }
const hex = d => Number(d).toString(16).padStart(2, '0')
😁Untuk kelengkapan, jika Anda menginginkan representasi hexadecimal dua-pelengkap dari angka negatif, Anda dapat menggunakan operator shift nol-isi-kanan
>>>
. Contohnya:Namun ada satu batasan: operator bitwise JavaScript memperlakukan operan mereka sebagai urutan 32 bit , yaitu, Anda mendapatkan komplemen 32-bit two's.
sumber
C# number to hexadecimal
menghasilkan hasil yang berbedaJavascript number to hexadecimal
. Sepertinya Javascript memiliki masalah dengan angka negatif. Jawaban ini tampaknya menjadi solusi untuk masalah tersebut.((-2)>>>0).toString(16).substring(2)
Dengan bantalan:
sumber
Tanpa loop:
Juga bukankah lebih baik tidak menggunakan tes putaran yang harus dievaluasi?
Misalnya, alih-alih:
memiliki
sumber
Menggabungkan beberapa ide bagus ini untuk fungsi RGB-value-to-hexadecimal (tambahkan tempat
#
lain untuk HTML / CSS):sumber
Jawaban yang diterima tidak memperhitungkan satu digit kode heksadesimal yang dikembalikan. Ini mudah disesuaikan dengan:
dan
Saya percaya jawaban di atas telah diposting berkali-kali oleh orang lain dalam satu atau lain bentuk. Saya membungkus ini dalam fungsi toHex () seperti:
Perhatikan bahwa ekspresi reguler numerik berasal dari 10+ Fungsi Ekspresi Reguler JavaScript yang Berguna 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 sadar saya tidak bisa mendapatkan angka negatif untuk bekerja.
Lebih lanjut - saya membaca beberapa tentang ini dan karena semua nomor JavaScript disimpan sebagai kata 64 bit tidak peduli apa - saya mencoba memodifikasi kode numHex untuk mendapatkan kata 64 bit. Tetapi ternyata Anda tidak bisa melakukan itu. Jika Anda memasukkan "3.14159265" AS A NUMBER ke dalam variabel - yang dapat Anda dapatkan adalah "3", karena bagian fraksional hanya dapat diakses dengan mengalikan angka dengan sepuluh (IE: 10.0) berulang kali. Atau dengan kata lain - nilai heksadesimal 0xF menyebabkan nilai floating point diterjemahkan ke dalam bilangan bulat sebelum ANDed yang menghapus semuanya di belakang periode. Daripada mengambil nilai secara keseluruhan (yaitu: 3.14159265) dan ANDing nilai floating point terhadap nilai 0xF.
Jadi hal terbaik yang harus dilakukan, dalam hal ini, adalah mengubah 3.14159265 menjadi sebuah string dan kemudian hanya mengonversi string tersebut. Karena hal di atas, itu juga memudahkan untuk mengkonversi angka negatif karena tanda minus hanya menjadi 0x26 di bagian depan nilai.
Jadi yang saya lakukan adalah menentukan bahwa variabel tersebut berisi angka - cukup konversikan ke string dan konversikan string. Ini berarti bagi semua orang bahwa di sisi server Anda harus mencopot pemasangan string yang masuk dan kemudian untuk menentukan informasi yang masuk adalah numerik. Anda dapat melakukannya dengan mudah dengan hanya menambahkan "#" ke depan angka dan "A" ke depan string karakter yang 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") benar-benar perlu dirubah. Seluruh pertanyaannya adalah "Bagaimana saya bisa melakukan ini dengan lebih efisien?" Saya memutuskan bahwa fungsi to / from hexadecimal seharusnya tidak peduli jika sesuatu merupakan bagian fraksional tetapi pada saat yang sama harus memastikan bahwa bagian fraksional termasuk dalam string.
Jadi kemudian pertanyaannya menjadi, "Bagaimana Anda tahu Anda bekerja dengan string heksadesimal?". Jawabannya sederhana. Gunakan informasi pra-string standar yang sudah dikenal di seluruh dunia.
Dengan kata lain - gunakan "0x". Jadi sekarang fungsi toHex saya terlihat untuk melihat apakah itu sudah ada dan apakah itu - hanya mengembalikan string yang dikirim ke sana. Kalau tidak, itu mengubah string, angka, apa pun. Berikut adalah fungsi toHex yang direvisi:
Ini adalah fungsi yang sangat cepat yang memperhitungkan satu digit akun, angka floating point, dan bahkan memeriksa untuk melihat apakah orang tersebut mengirim nilai hex over untuk di-hexed lagi. Ini hanya menggunakan empat panggilan fungsi dan hanya dua dari mereka yang ada di loop. Untuk melepas hex nilai yang Anda gunakan:
Seperti fungsi toHex (), fungsi fromHex () pertama-tama mencari "0x" dan kemudian menerjemahkan informasi yang masuk menjadi string jika belum menjadi string. Saya tidak tahu bagaimana ini bukan string - tetapi untuk berjaga-jaga - saya periksa. Fungsi kemudian berjalan, mengambil dua karakter dan menerjemahkannya ke karakter ASCII. Jika Anda ingin menerjemahkan Unicode, Anda harus mengubah perulangan menjadi empat (4) karakter sekaligus. Tapi kemudian Anda juga perlu memastikan bahwa string TIDAK dibagi oleh empat. Jika - maka itu adalah string heksadesimal standar. (Ingat string memiliki "0x" di depannya.)
Skrip pengujian sederhana untuk menunjukkan bahwa -3.14159265, ketika dikonversi ke string, masih -3.14159265.
Karena cara kerja JavaScript 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 yang dihasilkan oleh JavaScript itu sendiri. Saya percaya ini tentang sebaik yang didapatnya. Satu-satunya peningkatan yang tersisa adalah untuk W3C untuk hanya menyertakan fungsi toHex () dan fromHex () dalam JavaScript.
sumber
if( s.substr(0,2)
sebelumif (typeof s != "string")
mungkin bukan yang Anda inginkan, misalnya. Apa yang telah saya kembalikan juga bukan yang saya harapkan (toHex(0x1f635)
memberi"0x313238353635"
). Belum diselidiki lebih lanjut.substr
&toLowerCase
pada non-string ... sehinggatypeof
kebutuhan untuk datang lebih cepat, atau, jika Anda berharaptoHex
untuk melemparkan non-string di sana, Anda harus menghapustypeof
cek sepenuhnya. Masuk akal? Yaitu, jika saya menggunakan kode di sini tanpa suntingan, dan menelepontoHex(0x1f635)
, saya akan mendapatkannyaUncaught TypeError: s.substr is not a function
. Jika saya memindahkan string yang dilemparkan sebelumnya, Anda benar, angka yang dilemparkan ke desimal pertama, mungkin, dan semuanya berjalan menyamping. Yang tentu saja berarti Anda tidak dapat melakukan pemeran sederhana di sini jikas
bukan string.16 adalah radix dan ada 16 nilai dalam angka heksadesimal :-)
sumber
Bagi siapa pun yang tertarik, inilah JSFiddle membandingkan sebagian besar jawaban yang diberikan untuk pertanyaan ini .
Dan inilah metode yang akhirnya saya gunakan:
Juga, ingatlah bahwa jika Anda ingin mengonversi dari desimal ke heks untuk digunakan dalam CSS sebagai tipe data warna , Anda mungkin lebih suka mengekstraksi nilai RGB dari desimal dan menggunakan rgb () .
Misalnya ( JSFiddle ):
Ini menetapkan properti
#some-element
CSScolor
menjadirgb(64, 62, 154)
.sumber
Dibatasi / diisi ke sejumlah karakter:
sumber
Berikut ini adalah versi ECMAScript 6 yang dipangkas:
sumber
sumber
color: rgb(r,g,b)
mana rg dan b adalah angka desimal.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 }
Jika Anda ingin mengonversi angka menjadi representasi heksadesimal dari nilai warna RGBA, saya telah menemukan ini sebagai kombinasi paling berguna dari beberapa tips dari sini:
sumber
Komentar AFAIK 57807 salah dan harus seperti: var hex = Number (d) .toString (16); bukannya var hex = parseInt (d, 16);
sumber
Dan apakah angkanya negatif?
Ini versi saya.
sumber
Saya melakukan konversi ke string hex dalam loop yang cukup besar, jadi saya mencoba beberapa teknik untuk menemukan yang tercepat. Persyaratan saya adalah untuk memiliki string tetap-panjang sebagai hasilnya, dan menyandikan nilai negatif dengan benar (-1 => ff..f).
Sederhana
.toString(16)
tidak bekerja untuk saya karena saya membutuhkan nilai negatif untuk dikodekan dengan benar. Kode berikut adalah yang tercepat yang telah saya uji sejauh ini pada nilai 1-2 byte (perhatikan bahwasymbols
mendefinisikan jumlah simbol output yang ingin Anda dapatkan, yaitu untuk integer 4-byte harus sama dengan 8):Ia melakukan lebih cepat daripada
.toString(16)
pada angka 1-2 byte dan lebih lambat pada angka yang lebih besar (ketikasymbols
> = 6), tetapi masih harus mengungguli metode yang menyandikan nilai negatif dengan benar.sumber
Seperti yang dinyatakan dalam jawaban yang diterima, cara termudah untuk mengkonversi dari desimal ke heksadesimal adalah
var hex = dec.toString(16)
. Namun, Anda mungkin lebih suka menambahkan konversi string, karena memastikan bahwa representasi string suka"12".toString(16)
bekerja dengan benar.Untuk membalikkan proses Anda juga dapat menggunakan solusi di bawah ini, karena lebih pendek.
Tampaknya lebih lambat di Google Chrome dan Firefox, tetapi secara signifikan lebih cepat di Opera. Lihat http://jsperf.com/hex-to-dec .
sumber
Bagaimana mengkonversi desimal ke heksadesimal dalam JavaScript
Saya tidak dapat menemukan konversi desimal ke heksadesimal brutal yang bersih / sederhana yang tidak melibatkan kekacauan fungsi dan array ... jadi saya harus membuat ini untuk diri saya sendiri.
sumber
Singkatnya semuanya;
Namun, jika Anda tidak perlu mengubahnya kembali ke integer di akhir (yaitu untuk warna), maka pastikan nilainya tidak negatif sudah cukup.
sumber
Saya belum menemukan jawaban yang jelas, tanpa cek apakah itu negatif atau positif, yang menggunakan komplemen dua (termasuk angka negatif). Untuk itu, saya menunjukkan solusi saya ke satu byte:
Anda dapat menggunakan instruksi ini untuk sejumlah byte, hanya Anda tambahkan
FF
di tempat masing-masing. Misalnya, menjadi dua byte:Jika Anda ingin melemparkan integer array ke string heksadesimal:
sumber
Jika Anda ingin mengonversi ke representasi JavaScript atau CSS 'lengkap', Anda dapat menggunakan sesuatu seperti:
sumber
Anda dapat melakukan sesuatu seperti ini di ECMAScript 6 :
sumber
Jika Anda mencari untuk mengonversi bilangan bulat Besar mis. Angka lebih besar dari Number.MAX_SAFE_INTEGER - 9007199254740991, maka Anda dapat menggunakan kode berikut
sumber
Ini didasarkan pada solusi Prestaul dan Tod. Namun, ini adalah generalisasi yang memperhitungkan ukuran variabel yang bervariasi (mis. Parsing nilai yang ditandatangani dari log serial mikrokontroler).
Skrip uji:
Hasil tes:
Catatan: Tidak terlalu yakin mengapa gagal di atas 32 bitsize
sumber
Inilah solusi saya:
Pertanyaannya mengatakan: "Bagaimana mengkonversi desimal ke heksadesimal dalam JavaScript" . Sementara, pertanyaan tidak menentukan bahwa string heksadesimal harus dimulai dengan awalan 0x, siapa pun yang menulis kode harus tahu bahwa 0x ditambahkan ke kode heksadesimal untuk membedakan kode heksadesimal dari pengidentifikasi programatik dan angka lainnya (1234 dapat berupa heksadesimal, desimal, atau bahkan oktal).
Oleh karena itu, untuk menjawab pertanyaan ini dengan benar, untuk tujuan penulisan skrip, Anda harus menambahkan awalan 0x.
Fungsi Math.abs (N) mengubah negatif menjadi positif, dan sebagai bonus, itu tidak terlihat seperti seseorang menjalankannya melalui chipper kayu.
Jawaban yang saya inginkan, akan memiliki specifier lebar bidang, jadi kita bisa misalnya menunjukkan nilai 8/16/32/64-bit seperti yang Anda lihat dalam daftar aplikasi pengeditan heksadesimal. Itu, adalah jawaban yang sebenarnya dan benar.
sumber
Number('0xFF') === 255;
untuk semua orang di luar sana yang menginginkan operasi terbalik.