Số nguyên đến hai chữ số hex trong Java


82

Tôi cần thay đổi giá trị số nguyên thành giá trị hex gồm 2 chữ số trong Java. Có cách nào cho việc này không. Cảm ơn

Số lớn nhất của tôi sẽ là 63 và nhỏ nhất sẽ là 0. Tôi muốn một số 0 đứng đầu cho các giá trị nhỏ.


Bạn cần in nó? bạn cần biến nó thành một chuỗi?
Ahmed Masud

tôi sẽ viết vào tập tin như hai chữ số hex
Salih Erikci

Bạn đã ít nhất kiểm tra javadoc Integer chưa? Làm cách nào để chuyển đổi 12345656 sang giá trị hex có 2 chữ số?
JB Nizet,

Câu trả lời:


147
String.format("%02X", value);

Nếu bạn sử dụng Xthay vì x theo gợi ý của Aristar thì bạn không cần sử dụng .toUpperCase().


8
Đây là câu trả lời tốt nhất hiện tại.
David J.

1
Đồng ý rằng cái này tốt hơn nhiều so với bất kỳ cái nào khác. Nó hoạt động hoàn hảo. Điều duy nhất tôi muốn đề xuất là mô tả thêm một chút về các tham số được truyền cho phương thức. Tôi đã phải tra cứu xem tôi đã truyền giá trị dưới dạng số nguyên hay chuỗi hex.
JRSofty

31
Integer.toHexString(42);

Javadoc: http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#toHexString(int)

Tuy nhiên, lưu ý rằng điều này có thể cung cấp cho bạn nhiều hơn 2 chữ số! (Một Số nguyên là 4 byte, vì vậy bạn có thể lấy lại 8 ký tự.)

Đây là một chút khó khăn để lấy phần đệm của bạn, miễn là bạn hoàn toàn chắc chắn rằng bạn chỉ xử lý các giá trị một byte (255 trở xuống):

Integer.toHexString(0x100 | 42).substring(1)

Nhiều giải pháp khác (và tốt hơn) tại Số nguyên đệm bên trái (định dạng không thập phân) với số không trong Java .


3
Bản hack zero-padding tốt đẹp :)
Grodriguez

1
Bạn có thể sử dụng kỹ thuật tương tự cho các giá trị lớn hơn. Nếu bạn muốn đệm cho giá trị 2 byte, bạn có thể thực hiện Integer.toHexString (0x10000 | value) .substring (1). Đối với N chữ số hex, bạn thêm N 0 sau chữ "1". Tất nhiên, giá trị hex của bạn không được có nhiều hơn N chữ số.
user823981

28
String.format("%02X", (0xFF & value));    

7
Ai đó có thể giải thích lý do tại sao điều này đang làm một chút khôn ngoan và với 0xFF? Đây là lý do tại sao câu trả lời về SO không nên chỉ được mã
Stealth Rabbi

4
Giá trị OxFF & (byte) chỉ chuyển byte có dấu thành không dấu. (int) -1 = 0xFFFFFFFF, (int) (- 1 & 0xFf) = 0xFF
Aristar

Trong trường hợp này, bit-khôn ngoan và với 0xFF là không cần thiết vì định dạng "% 02X".
Freek de Bruijn

1
Trình xác định% 02X chỉ định tối thiểu hai chữ số. Nếu bạn muốn chính xác hai chữ số (loại bỏ các bit cao hơn) thì bạn cần bitwise và.
plugwash

Thật tốt khi biết, cảm ơn vì thông tin bổ sung này!
tryp

14

Sử dụng Integer.toHexString(). Đừng quên thêm một số 0 ở đầu nếu bạn chỉ kết thúc bằng một chữ số. Nếu số nguyên của bạn lớn hơn 255, bạn sẽ nhận được nhiều hơn 2 chữ số.

StringBuilder sb = new StringBuilder();
sb.append(Integer.toHexString(myInt));
if (sb.length() < 2) {
    sb.insert(0, '0'); // pad with leading zero if needed
}
String hex = sb.toString();

2
Việc sử dụng có StringBuilderthực sự là một cải tiến? pastebin.com/KyS06JMz
chỉ phát hành

4

Nếu bạn chỉ cần in chúng, hãy thử điều này:

for(int a = 0; a < 255; a++){
    if( a % 16 == 0){
        System.out.println();
    }
    System.out.printf("%02x ", a);
}

0

tôi sử dụng điều này để nhận một chuỗi đại diện cho giá trị hex tương đương của một số nguyên được phân tách bằng dấu cách cho mỗi byte EX: hex val of 260 in 4 byte = 00 00 01 04

    public static String getHexValString(Integer val, int bytePercision){
    StringBuilder sb = new StringBuilder();
    sb.append(Integer.toHexString(val));

    while(sb.length() < bytePercision*2){
        sb.insert(0,'0');// pad with leading zero
    }

    int l = sb.length(); // total string length before spaces
    int r = l/2; //num of rquired iterations

    for (int i=1; i < r;  i++){
        int x = l-(2*i); //space postion
        sb.insert(x, ' ');
    }
    return sb.toString().toUpperCase();         
}

public static void main(String []args){
    System.out.println("hex val of 260 in 4 bytes = " + getHexValString(260,4));
}

0

Theo GabrielOshiro, Nếu bạn muốn định dạng số nguyên thành độ dài 8, hãy thử cách này

String.format("0x%08X", 20) //print 0x00000014
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.