2009-09-23 25 views
6

W języku Java, w jaki sposób szesnastkowa reprezentacja ciągów bajtów (np. "1e") może zostać przekonwertowana na wartość bajtową?Konwertuj ciąg szesnastkowy na bajt w języku Java

Na przykład:

byte b = ConvertHexStringToByte("1e"); 
+0

So jakie jest Twoje pytanie? Jeśli w ogóle? – EJP

+0

To było dobre pytanie. Dlaczego został zamknięty? – Joe

Odpowiedz

15
Integer.parseInt(str, 16); 
+0

Próbowałem, ale to tworzy int, nie bajt - więc dla "1e" otrzymam 30, a nie 0x1e, nawet jeśli będę rzutował na bajt. – phpscriptcoder

+1

Jak można odróżnić bajt o wartości 30 i 0x1e, które są przechowywane identycznie po bajcie typu? –

+2

@phpscriptcoder: Nie, dostaniesz 1e. Spróbuj tego: String roundtrip = Integer.toHexString (Integer.parseInt (str, 16)); – erickson

12

Byte.parseByte zwróci byte przez parsowania reprezentację ciąg.

Stosując metodę z podpisu (String, int), Radix można określić jako 16, więc można analizować szesnastkowy reprezentację bajt:

Byte.parseByte("1e", 16); 
+7

Niebezpieczeństwo! Ta metoda nie przeanalizuje wartości ujemnych bajtów, na przykład "AD". Zobacz http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6259307. Lepiej używać Integer.parseInt –

+1

@Dave L. To nie jest poprawne, ponieważ według ewaluatora: Dana metoda zachowuje się dokładnie tak, jak określono. W przypadku tej metody wartość ujemna musi być wskazana za pomocą znaku minus "-" i nie należy ustawiać bit znaku, ponieważ bit wyższego rzędu ma wartość jeden. Innymi słowy, dla podstawy 16 poprawne łańcuchy mają zakres od "-80" (-128) do "7f" (127); Baza "AD" 16 jest dodatnia 173, która jest poza zakresem. – Caner

+1

@LAS_VEGAS Rzeczywiście Bajt.parseByte działa jak podano, jednak jeśli ktoś chce przekonwertować 2-znakową reprezentację szesnastkową 8-bitowej wartości do odpowiedniego bajtu, jak sugeruje to pytający, to ta metoda (jak określono i zaimplementowana!) nie rób tego dla wartości, w których bit wyższego rzędu wynosi 1. –

19

Można użyć Byte.parseByte("a", 16); ale to działa tylko dla wartości do 127, wartości wyższe wtedy, że będzie musiał oddać do bajta, ze względu na podpisanych/niepodpisanych kwestii więc polecam do przeniesienia go do int a następnie wrzucił go do bajt

(byte) (Integer.parseInt("ef",16) & 0xff); 
+1

: Dlaczego '& 0xff'? –

+1

& 0xff służy do uzyskania wartości uns. Int. – JCasso

+1

To powinna być zaakceptowana odpowiedź! Dokładnie to, czego potrzebowałem! – VikingPingvin