Ціле число до двох цифр шістнадцяткового рівня в 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.