Java'da tamsayı iki basamaklı onaltılık


82

Java'da bir tamsayı değerini 2 basamaklı onaltılık değere değiştirmem gerekiyor, bunun için herhangi bir yolu var mı? Teşekkürler

En büyük sayım 63 ve en küçük 0 olacak. Küçük değerler için baştaki sıfır istiyorum.


Yazdırmanız mı gerekiyor? onu bir dizeye dönüştürmeniz mi gerekiyor?
Ahmed Masud

dosyaya iki haneli hex olarak yazacağım
Salih Erikci

En azından Integer javadoc'u kontrol ettiniz mi? 12345656'yı 2 basamaklı onaltılık bir değere nasıl dönüştürmeyi planlıyorsunuz?
JB Nizet

Yanıtlar:


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

Eğer kullanırsanız Xyerine x aristar önerdiği gibi , o zaman kullanımına gerek yoktur .toUpperCase().


8
Şu anda en iyi cevap bu.
David J.

1
Bunun diğerlerinden çok daha iyi olduğu konusunda hemfikirim. Mükemmel çalışıyor. Önereceğim tek şey, yönteme aktarılan parametrelerin biraz daha açıklanmasıdır. Değeri tamsayı olarak mı yoksa onaltılık dizge olarak mı ilettiğime bakmak zorunda kaldım.
JRSofty

31
Integer.toHexString(42);

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

Bununla birlikte, bunun size 2'den fazla rakam verebileceğini unutmayın! (Bir Tamsayı 4 bayttır, bu nedenle potansiyel olarak 8 karakter geri alabilirsiniz.)

Yalnızca tek baytlık değerlerle (255 veya daha az) uğraştığınızdan kesinlikle emin olduğunuz sürece, dolgunuzu almak için bir parça hack verelim:

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

Java'da sıfırlarla Sol doldurma tamsayılarında (ondalık olmayan format) çok daha fazla (ve daha iyi) çözüm .


3
Güzel sıfır dolgu hilesi :)
Grodriguez

1
Daha büyük değerler için aynı tekniği kullanabilirsiniz. 2 baytlık değerlere kadar doldurma istiyorsanız, Integer.toHexString (0x10000 | değer) .substring (1) yapabilirsiniz. N onaltılık basamak için "1" den sonra N 0 eklersiniz. Elbette, onaltılık değeriniz N'den fazla basamak içermemelidir.
user823981

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

7
Birisi bunun neden biraz akıllıca ve 0xFF ile yaptığını açıklayabilir mi? Bu yüzden SO'daki cevaplar sadece kod olmamalı
Stealth Rabbi

4
OxFF & (bayt) değeri sadece işaretli baytı işaretsiz hale dönüştürür. (int) -1 = 0xFFFFFFFF, (int) (- 1 ve 0xFf) = 0xFF
aristar

Bu durumda, "% 02X" formatı nedeniyle bit bazlı ve 0xFF ile gerekli değildir.
Freek de Bruijn

1
% 02X belirteci minimum iki basamak belirtir. Tam olarak iki basamak istiyorsanız (daha yüksek bitleri atarak) o zaman bitsel ve.
2016

Bilmekte fayda var, bu ek bilgi için teşekkürler!
tryp

14

Kullanın Integer.toHexString(). Sonunda yalnızca bir rakam varsa, başında sıfır ile doldurmayı unutmayın. Tam sayınız 255'ten büyükse, 2'den fazla basamak elde edersiniz.

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
Kullanımı StringBuildergerçekten bir gelişme mi? pastebin.com/KyS06JMz
sadece

4

Sadece yazdırmanız gerekiyorsa şunu deneyin:

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

1

Bunu, her bayt için boşlukla ayrılmış bir tamsayının eşdeğer onaltılık değerini temsil eden bir dize elde etmek için kullanıyorum EX: 4 baytta 260'ın onaltılık değeri = 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'ya göre, tamsayıyı 8 uzunluğa formatlamak istiyorsanız

String.format("0x%08X", 20) //print 0x00000014
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.