2009-09-23 5 views
6

En Java, comment une représentation en chaîne hexadécimale d'un octet (par exemple "1e") peut-elle être convertie en une valeur d'octet?Conversion d'une chaîne hexadécimale en octet en Java

Par exemple:

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

alors quelle est votre question? Si seulement? – EJP

+0

C'était une bonne question. Pourquoi était-il fermé? – Joe

Répondre

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

J'ai essayé cela mais cela crée un int, pas un octet - donc pour "1e" j'obtiendrais 30, pas 0x1e, même si je lance un octet. – phpscriptcoder

+1

Comment distingueriez-vous un octet de valeur 30 et 0x1e, qui sont stockés de manière identique lors du type byte? –

+2

@phpscriptcoder: Non, vous obtiendrez 1e. Essayez ceci: String roundtrip = Integer.toHexString (Integer.parseInt (str, 16)); – erickson

12

Byte.parseByte retourne une byte par l'analyse d'une représentation de chaîne.

En utilisant la méthode avec la signature (String, int), le radix peut être spécifié comme 16, on peut donc analyser une représentation hexadécimale d'un octet:

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

Danger! Cette méthode échouera à analyser les valeurs d'octets négatifs, par exemple, "AD". Voir http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6259307. Mieux vaut utiliser Integer.parseInt –

+1

@Dave L. Ce n'est pas correct car selon l'évaluateur: La méthode en question se comporte exactement comme spécifié. Avec cette méthode, une valeur négative doit être indiquée en utilisant un signe moins "-" et ne pas définir le bit de signe en ayant le bit de poids fort un. En d'autres termes, pour la base 16, les chaînes valides vont de "-80" (-128) à "7f" (127); La base "AD" 16 est positive 173, ce qui est hors de portée. – Caner

+1

@LAS_VEGAS En effet Byte.parseByte fonctionne comme spécifié, cependant si quelqu'un veut convertir une représentation hexadécimale de 2 caractères d'une valeur de 8 bits à l'octet correspondant, comme implicite par le questionneur, alors cette méthode (telle que spécifiée et implémentée!) Ne faites pas cela pour les valeurs où le bit de poids fort est 1. –

19

Vous pouvez utiliser Byte.parseByte("a", 16); mais cela ne fonctionnera que pour les valeurs jusqu'à 127, des valeurs plus élevées alors que devront jeter à l'octet, en raison de problèmes signés/non signés donc je recommande de le transférer à un entier, puis le jeter à l'octet

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

: Pourquoi '& 0xff'? –

+1

& 0xff est utilisé pour obtenir la valeur non signée de int. – JCasso

+1

Cela devrait être la réponse acceptée! Il fait exactement ce dont j'avais besoin! – VikingPingvin

Questions connexes