2017-07-21 4 views
-2

J'essaie de convertir une chaîne composée de données hexadécimales comme C120, ce qui signifie A et (espace) respectivement. Je reçois la chaîne et essaie de la diviser en un tableau de chaînes. J'essaie alors d'itérer ce tableau et d'obtenir les valeurs UTF-8 correspondantes. Voici mon code:Conversion de la chaîne HEX en retours EBCDIC Exception de format numérique

public static String toEbcdic(String strToConvert){ 
    String[] test = strToConvert.split("(?<=\\G..)"); 
    ByteBuffer sb = ByteBuffer.allocate(test.length); 
    for (String s : test) { 
     Byte valueOf = Byte.valueOf(s, 10); 
     sb.put(valueOf); 
    } 
    return new String(sb.array(), "CP1047"); 
} 

Lorsqu'il est passé l'entrée C120C2, je reçois l'exception suivante:

Exception in thread "main" java.lang.NumberFormatException: For input string: "C1" 

Qu'est-ce que je fais mal? Que devrait-on faire pour obtenir la valeur EBCDIC correspondante?

Répondre

1

simple one-liner:

public static String toEbcdic(String hexStr) throws IOException { 
    return new String(DatatypeConverter.parseHexBinary(hexStr), "CP1047"); 
} 

Votre code se trouve dans la bonne direction, en convertissant en tableau d'octets et de créer une nouvelle chaîne dans CP1047. Vous ne devez corriger deux problèmes pour le faire fonctionner:

  1. La chaîne d'octets est en hexadécimal (base 16) au lieu de dec (base 10).
  2. L'octet Java est signé, donc l'alimenter C1 déclenchera une exception "Value out of range".
    La solution est simple: analyser aussi court et renvoyer à l'octet.

Voici un exemple fixe complet:

import java.io.IOException; 
import java.nio.ByteBuffer; 

public class Q45235042 { 

    public static String toEbcdic(String strToConvert) throws IOException { 
     String[] test = strToConvert.split("(?<=\\G..)"); 
     ByteBuffer sb = ByteBuffer.allocate(test.length); 
     for (String s : test) 
     sb.put((byte) Short.parseShort(s, 16)); 
     return new String(sb.array(), "CP1047"); 
    } 

    public static void main(String[] args) throws IOException { 
     System.out.println(toEbcdic("C120C2")); 
    } 
} 
+0

Vous m'avez sauvé après une semaine de travail. J'aimerais que cela soit déjà arrivé. Merci! Je n'ai jamais pensé à aller à court et puis à byte. Mais le seul paquebot est génial. Merci encore! Malheureusement, la prime peut être accordée après 20 heures, alors je vais le faire une fois qu'il aura traversé le temps. :) – JackSlayer94

1

Hex est base 16 ne base 10. Changement

Byte valueOf = Byte.valueOf(s, 10); 

à

Byte valueOf = Byte.valueOf(s, 16); 

ou utilisation Byte.parseByte(String, int) pour obtenir le type primitif (au lieu de l'enveloppe).

byte valueOf = Byte.parseByte(s, 16); 
+0

Je ne cherche pas à le convertir en hexadécimal, mais la valeur ebcdic. – JackSlayer94

+0

Non. Vous essayez de convertir une valeur hexadécimale en binaire. Et "c" n'est pas un chiffre valide en décimal. –

+0

Bon alors comment puis-je convertir une chaîne de représentation hexadécimale en ebcdic? – JackSlayer94