Ціле число до двох цифр шістнадцяткового рівня в Java


82

Мені потрібно змінити ціле число на двозначне шістнадцяткове значення в Java. Чи є для цього спосіб. Дякую

Моє найбільше число буде 63, а найменше - 0. Я хочу початковий нуль для малих значень.


Вам потрібно його роздрукувати? вам потрібно перетворити це на рядок?
Ахмед Масуд,


Ви принаймні перевіряли Invager Javadoc? Як ви плануєте перетворити 12345656 у двозначне шістнадцяткове значення?
JB Nizet

Відповіді:


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

Якщо ви використовуєте Xзамість того, x як запропонував aristar , тоді вам не потрібно використовувати .toUpperCase().


8
На сьогодні це найкраща відповідь.
Девід Дж.

1
Погодився, що цей набагато кращий за будь-який з інших. Це чудово працює. Єдине, що я б запропонував, це трохи більше опису параметрів, переданих методу. Мені довелося шукати, якщо я передав значення як ціле число або як шістнадцятковий рядок.
JRS Софі

31
Integer.toHexString(42);

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

Зверніть увагу, що це може дати вам більше 2 цифр! (Ціле число - 4 байти, тому ви можете повернути 8 символів.)

Ось трохи хак, щоб отримати ваше заповнення, якщо ви абсолютно впевнені, що маєте справу лише з однобайтовими значеннями (255 або менше):

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

Набагато більше (і кращих) рішень з лівими відступами цілих чисел (недесятковий формат) із нулями в Java .


3
Хороший хакер з
нульовим забиванням

1
Ви можете використовувати ту саму техніку для більших значень. Якщо ви хочете заповнити до 2-байтових значень, ви можете зробити Integer.toHexString (0x10000 | значення) .substring (1). Для N шістнадцяткових цифр ви додаєте N 0 після "1". Звичайно, ваше шістнадцяткове значення має містити не більше N цифр.
user823981

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

7
Хтось може пояснити, чому це робиться трохи по-розумному і з 0xFF? Ось чому відповіді на SO не повинні бути просто кодом
Stealth Rabbi

4
Значення OxFF & (байт) просто перетворює підписаний байт у беззнаковий. (int) -1 = 0xFFFFFFFF, (int) (- 1 & 0xFf) = 0xFF
aristar

У цьому випадку розрядні та з 0xFF не потрібні через формат "% 02X".
Фрік де Бруйн

1
Специфікатор% 02X визначає мінімум дві цифри. Якщо вам потрібні рівно дві цифри (відкидаючи більші біти), тоді вам потрібно побітове та.
plugwash

Корисно знати, дякую за цю додаткову інформацію!
tryp

14

Використовуйте Integer.toHexString(). Не забудьте заповнити початковий нуль, якщо у вас вийде лише одна цифра. Якщо ваше ціле число більше 255, ви отримаєте більше 2 цифр.

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
Чи використання StringBuilderнасправді вдосконалення? pastebin.com/KyS06JMz
просто навчання

4

Якщо вам просто потрібно їх надрукувати, спробуйте наступне:

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

1

я використовую це, щоб отримати рядок, що представляє еквівалентне шістнадцяткове значення цілого числа, відокремлене пробілом для кожного байта EX: шістнадцятковий val 260 у 4 байтах = 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

За словами GabrielOshiro, якщо ви хочете, щоб формат цілого числа довжиною 8, спробуйте це

String.format("0x%08X", 20) //print 0x00000014
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.