2010-10-30 5 views
1

Je fais une mission à ce sujet. Eaxmple: J'ai un message (chaîne), et la longueur est de 302 en déc, 12e en hexadécimal.Comment changer la chaîne hexadécimale en 4 octets en java?

String message = "THE MESSAGE BODY"; 
int lengthOfMessage = number.length(); // 302 
String lengthOfMessageInHex = Integer.toHexString(lengthOfMessage); // 12e 

Maintenant, je dois changer le lengthOfMessageInHex de "12e" à "0000012e".

lengthOfMessageInHex = ("00000000" + lengthOfMessageInHex) 
       .substring(lengthOfMessageInHex.length()); // 0000012e 

Et maintenant je voudrais stocker 00 00 01 2e à un nouvel octet [4].

Comment puis-je le faire?

Merci.

Répondre

0

Je voudrais juste faire ...

 byte[] byt = new byte[4];  
     byt[0] = Byte.parseByte(lengthOfMessageInHex.substring(0, 2), 16); 
     byt[1] = Byte.parseByte(lengthOfMessageInHex.substring(2, 4), 16); 
     byt[2] = Byte.parseByte(lengthOfMessageInHex.substring(4, 6), 16); 
     byt[3] = Byte.parseByte(lengthOfMessageInHex.substring(6, 8), 16); 
+0

Oui, j'ai suivi la suggestion d'extraneon et je l'ai mise en œuvre comme votre code. Merci. – Roy

2

Si vous avez l'entier d'origine, pourquoi ne pas simplement utiliser qui au lieu d'une chaîne, quelque chose comme:

byt[0] = lengthOfMessage/16777216;   // most significant. 
byt[1] = (lengthOfMessage % 16777216)/65536; 
byt[2] = (lengthOfMessage % 65536)/256; 
byt[3] = lengthOfMessage % 256;     // least significant. 

Si, pour une raison quelconque, vous ne pas ont accès au entier d'origine (si la chaîne est stockée dans un fichier texte ou envoyé à travers le fil), vous pouvez utiliser parseInt pour obtenir l'entier de retour avant d'utiliser la méthode ci-dessus:

string s = "0000012eRestOfMessage"; 
int x; 
try { 
    x = Integer.parseInt (s.substring (0,8), 16); 
} catch (Exception e) {} 

Sinon, vous pouvez contourner l'étape intermédiaire tout à fait avec quelque chose comme:

string s = "0000012eRestOfMessage"; 
byte byt[4]; 
try { 
    for (int i = 0; i < 4; i++) { 
     int x = Integer.parseInt (s.substring (i*2,2), 16); 
     byt[i] = (byte)((x > 127) ? x - 256 : x); 
    } 
} catch (Exception e) {} 
+0

lengthOfMessage est un int, je ne peux pas changer à l'octet – Roy

+0

Vous n'êtes pas tourner lengthOfMessage en un int, vous effectuez des calculs sur elle pour obtenir des bits qui sont moins de 256. Ensuite, vous pouvez simplement les convertir en octets, en gardant à l'esprit que vous devrez peut-être mapper 0..255 à 0 ..- 1. – paxdiablo

0

Je pense que je préférerais la solution de paxdiablo, mais une alternative pourrait être fait en découpant votre chaîne en chaînes courtes de 2 (par exemple 00 00 01 2e = 4 chaînes séparées) et en utilisant Byte.valueOf(String s, int radix) créant ainsi un octet, puis en utilisant byteValue() sur cet octet pour obtenir l'octet.

+0

"radix" dans Byte.valueOf (chaîne s, int radix) donnera 16 ou autre? – Roy

+0

OH oui, je peux le faire !!! Merci. – Roy

Questions connexes