Uzgodniono, że ten jest znacznie lepszy niż którykolwiek z pozostałych. Działa doskonale. Jedyne co bym zasugerował to trochę dokładniejszy opis parametrów przekazywanych do metody. Musiałem sprawdzić, czy przekazałem wartość jako liczbę całkowitą, czy jako ciąg szesnastkowy.
Możesz użyć tej samej techniki dla większych wartości. Jeśli chcesz dopełnić maksymalnie 2-bajtowe wartości, możesz zrobić Integer.toHexString (0x10000 | value) .substring (1). W przypadku N cyfr szesnastkowych należy dodać N 0 po „1”. Oczywiście twoja wartość szesnastkowa nie może mieć więcej niż N cyfr.
Czy ktoś może wyjaśnić, dlaczego to działa trochę mądrze i z 0xFF? Dlatego odpowiedzi na SO nie powinny być tylko kodem
Stealth Rabbi
4
OxFF & (bajt) wartość po prostu konwertuje bajt ze znakiem na bez znaku. (int) -1 = 0xFFFFFFFF, (int) (- 1 & 0xFf) = 0xFF
aristar
W tym przypadku bit-mądry i 0xFF nie jest konieczny ze względu na format „% 02X”.
Freek de Bruijn
1
Specyfikator% 02X określa co najmniej dwie cyfry. Jeśli chcesz mieć dokładnie dwie cyfry (odrzucając wyższe bity), potrzebujesz bitowego i.
plugwash
Dobrze wiedzieć, dziękuję za dodatkowe informacje!
tryp
14
Użyj Integer.toHexString(). Nie zapomnij uzupełnić początkowego zera, jeśli otrzymasz tylko jedną cyfrę. Jeśli Twoja liczba całkowita jest większa niż 255, otrzymasz więcej niż 2 cyfry.
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();
Używam tego, aby uzyskać ciąg reprezentujący równoważną wartość szesnastkową liczby całkowitej oddzielonej spacją dla każdego bajtu
EX: wartość szesnastkowa 260 na 4 bajty = 00 00 01 04
publicstatic 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 spacesint r = l/2; //num of rquired iterationsfor (int i=1; i < r; i++){
int x = l-(2*i); //space postion
sb.insert(x, ' ');
}
return sb.toString().toUpperCase();
}
publicstaticvoidmain(String []args){
System.out.println("hex val of 260 in 4 bytes = " + getHexValString(260,4));
}
Odpowiedzi:
String.format("%02X", value);
Jeśli używasz
X
zamiast,x
jak sugeruje aristar , nie musisz używać.toUpperCase()
.źródło
Integer.toHexString(42);
Javadoc: http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#toHexString(int)
Pamiętaj jednak, że może to dać więcej niż 2 cyfry! (Liczba całkowita ma 4 bajty, więc potencjalnie możesz odzyskać 8 znaków).
Oto mały hack, aby uzyskać dopełnienie, o ile masz absolutną pewność, że masz do czynienia tylko z wartościami jednobajtowymi (255 lub mniej):
Integer.toHexString(0x100 | 42).substring(1)
O wiele więcej (i lepszych) rozwiązań w Lewy dopełnianie liczb całkowitych (format niedziesiętny) zerami w Javie .
źródło
String.format("%02X", (0xFF & value));
źródło
Użyj
Integer.toHexString()
. Nie zapomnij uzupełnić początkowego zera, jeśli otrzymasz tylko jedną cyfrę. Jeśli Twoja liczba całkowita jest większa niż 255, otrzymasz więcej niż 2 cyfry.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();
źródło
StringBuilder
rzeczywiście jest poprawą? pastebin.com/KyS06JMzJeśli chcesz je tylko wydrukować, spróbuj tego:
for(int a = 0; a < 255; a++){ if( a % 16 == 0){ System.out.println(); } System.out.printf("%02x ", a); }
źródło
Używam tego, aby uzyskać ciąg reprezentujący równoważną wartość szesnastkową liczby całkowitej oddzielonej spacją dla każdego bajtu EX: wartość szesnastkowa 260 na 4 bajty = 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)); }
źródło
Według GabrielOshiro, jeśli chcesz sformatować liczbę całkowitą do długości 8, spróbuj tego
String.format("0x%08X", 20) //print 0x00000014
źródło