Câu hỏi Làm thế nào để chuyển đổi thập phân sang hex trong JavaScript?


Làm thế nào để bạn chuyển đổi các giá trị thập phân sang số hex tương đương trong JavaScript?


1186
2017-09-11 22:26


gốc


Chỉ cần một cảnh báo ở đây là bạn đang bắt đầu từ một chuỗi đại diện của nó rất dễ dàng để mất chính xác khi bạn biến nó thành số như một phần của chuyển đổi nó thành hex. Xem danvk.org/wp/2012-01-20/…. - studgeek


Các câu trả lời:


Chuyển đổi một số thành chuỗi thập lục phân có:

hexString = yourNumber.toString(16);

và đảo ngược quá trình với:

yourNumber = parseInt(hexString, 16);

1997
2017-09-11 22:28



yourNum là một chuỗi hex trong trường hợp này. Ví dụ. (255) .toString (16) == 'ff' && parseInt ('ff', 16) == 255 - Prestaul
@forste, bạn sẽ không "mất độ chính xác" nếu bạn chuyển đổi một Số javascript (đó là một đối tượng Số, trong đó kịch bản ECMA là một Đôi) để hex và trở lại bằng cách sử dụng kỹ thuật này. Câu hỏi bạn đã liên kết là tham chiếu cụ thể các số quá lớn để vừa với một Double (do đó biểu diễn chuỗi trong câu hỏi). Nếu bạn đã có một số thì điều này sẽ làm việc. Nếu bạn có một cái gì đó quá lớn để trở thành một đối tượng Number javascript (một Double) thì bạn sẽ phải tìm một cái gì đó khác. - Prestaul
@ Derek, tôi có một vấn đề tâm lý không cho phép tôi chịu đựng được những dấu ngoặc đơn không cần thiết ... @ mọi người khác, yourNumber là một biến. Nếu bạn muốn sử dụng một chữ số thì bạn sẽ phải làm một cái gì đó như (45).toString(16), nhưng nếu bạn mã hóa một số thì hãy viết nó như một chuỗi ký tự hex ... (45).toString(16) sẽ luôn bằng nhau '2d', do đó, không lãng phí chu kỳ CPU để tìm ra điều đó. - Prestaul
@Prestaul "Đừng lãng phí chu kỳ CPU để tìm ra điều đó" - được gọi là tối ưu hóa sớm. Trừ khi JavaScript đang chạy trên 286, tôi nghi ngờ vấn đề trên không. Hơn nữa, '45' có thể là số ma thuật mà lập trình viên cần để có thể nhận ra (chẳng hạn như thời gian chờ tính bằng giây), trong khi '2d', ai sẽ nhận ra điều đó? - Dejay Clayton
Nếu bạn không thích dấu ngoặc đơn, bạn chỉ có thể sử dụng dấu chấm phụ: 42..toString(16) - Thomas Watson


Nếu bạn cần xử lý những thứ như trường bit hoặc màu 32 bit, thì bạn cần xử lý các số đã ký. Hàm javascript toString(16) sẽ trả về một số hex âm mà thường không phải là thứ bạn muốn. Chức năng này làm một số bổ sung điên rồ để làm cho nó một số tích cực.

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



là bổ sung của hai? - Julian
Chuyển đổi này thường không cần thiết vì JavaScript có thể đại diện cho tất cả các trường bit 32 bit dưới dạng số không dấu (xem Number.MAX_SAFE_INTEGER). Vì lý do tương tự, việc chuyển đổi thành unsigned có thể được viết như sau: number = 0x100000000 + number; - Johannes Matokic
Một lưu ý ngắn trên bình luận trước đây của tôi: Trong khi biểu diễn hex nên làm việc cho các số lên đến Number.MAX_SAFE_INTEGER, điều này không giữ cho các hoạt động bitwise (thường được sử dụng để tạo các màu 32 bit). Kết quả của phép toán bitwise luôn là số nguyên 32 bit đã ký. Do đó kết quả bitwise> = 2 ^ 31 là số âm và 0x100000000 | 0 === 0. - Johannes Matokic
Bạn có thể dùng >>> toán tử để chuyển đổi số thành đại diện không dấu, ví dụ: ((-3253) >>> 0).toString(16) trả về "fffff34b". - csharpfolk


Mã dưới đây sẽ chuyển đổi giá trị thập phân d thành hex. Nó cũng cho phép bạn thêm đệm vào kết quả hex. do đó 0 sẽ trở thành 00 theo mặc định.

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



Điều này sẽ không xử lý đúng các giá trị âm. decimalToHex (-6, 4) sẽ trả về 00-6. - JonMR
Nó cũng có vấn đề với phao nổi, nhưng đặt Math.round () đã sửa lỗi đó. (+1) - Michael


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

45
2017-11-05 21:08



Điều này, hoặc một cái gì đó như nó phải là câu trả lời được chấp nhận. Trong 99% các trường hợp, bạn không muốn biến chuỗi hex dài! - user239558
Điều này hoàn toàn nên không phải là câu trả lời được chấp nhận. 1. Đó là một lớp lót khó chịu cực kỳ khó đọc. Gây ra rất nhiều chi phí tinh thần không cần thiết. 2. Nỗ lực của nó trong việc đảm bảo các chuỗi hex dài không biến đổi là vô ích và chỉ hoạt động nếu số của bạn phù hợp với một byte đơn (trong đó, IMO, hiếm). - JMTyler
function hexRep(number, width) { return (number+Math.pow(16, precision)).toString(16).slice(-width); } - Lori
Nó không phải là khó để mở rộng nó, bạn đang cắt bỏ các chữ số cuối cùng với .slice (-number) ở đó. Nếu bạn thêm số 0 vào trước thì nó sẽ hoạt động tốt. - Tatarize
ES6 const hex = d => Number(d).toString(16).padStart(2, '0')  - Ninh Pham


Với đệm:

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

31
2017-07-13 14:29



Chính xác thì sao .substr(-4) làm việc ở đây? - Lucas
@Lucas Nó trả về 4 ký tự cuối cùng. - Gabriel


Để hoàn thành, nếu bạn muốn bổ sung hai đại diện thập lục phân của một số âm, bạn có thể sử dụng -sự dịch chuyển không-điền-phải >>> nhà điều hành. Ví dụ:

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

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

Tuy nhiên, có một giới hạn: các toán tử bitwise của javascript xử lý các toán hạng của chúng như một chuỗi gồm 32 bit, nghĩa là, bạn nhận được phần bổ sung 32 bit.


25
2018-06-14 10:59



đây là câu trả lời có giá trị nhất cho câu hỏi này :) - albertjan


Không có vòng lặp:

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

Cũng không tốt hơn là không sử dụng các bài kiểm tra vòng lặp phải được đánh giá ví dụ thay vì:

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

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

16
2017-09-11 03:05