Search code examples
javacharacter-encodinghexasciiebcdic

ASCII to EBCDIC Character Incoding


While converting ASCII String to EBCDIC:

System.out.println(new String("0810C2200000820000000400000000000000052852304131419391011590620022300270".getBytes("UTF-8"), "CP1047"));

I am getting below as output String:

ä??????

But, what I want is:

F0 F8    F1 F0    C2 20    00 00    82 00    00 00    04 00  00 00    00 00    00 00   F4 F1    F0 F1    F1 F5  F9 F0    F6 F2    F0 F0    F2 F2    F3 F0    F0 F2    F7 F0

How I can achieve it? Any help will be appreciated.

Thanks


Solution

  • You can convert the string this way

    String string = "0810C220";
    byte[] bytes = string.getBytes("CP1047");
    for (int i = 0; i < bytes.length; i++) {
        System.out.printf("%s %X%n", string.charAt(i), bytes[i]);
    }
    

    But your example seems to be wrong.

    following are correct, one character from input string is converted to the related EBCDIC code

    0 F0
    8 F8
    1 F1
    0 F0
    

    here your example is wrong, because your example treats C2 and 20 as two characters in the input string but not as two characters in the EBCDIC code

    C C3
    2 F2
    2 F2
    0 F0
    

    For the conversion in the other direction you could do it that way

    // string with hexadecimal EBCDIC codes
    String sb = "F0F8F1F0";
    int countOfHexValues = sb.length() / 2;
    byte[] bytes = new byte[countOfHexValues];
    for(int i = 0; i < countOfHexValues; i++) {
        int hexValueIndex = i * 2;
        // take one hexadecimal string value
        String hexValue = sb.substring(hexValueIndex, hexValueIndex + 2);
        // convert it to a byte
        bytes[i] = (byte) (Integer.parseInt(hexValue, 16) & 0xFF);
    }
    // constructs a String by decoding bytes as EBCDIC
    String string = new String(bytes, "CP1047");