打印包含EBCDIC值的字节数组不会给出预期值

时间:2017-03-29 17:50:06

标签: java string ebcdic

我创建了一个字符串转换得到一个字节数组,使用EBCDIC编码。当我打印数组时,H的值与EBCDIC图表中的不一样。

预期输出

根据链接EBCDIC 1047 chart" H" - > 200的EBCDIC值

实际输出

" H" - > [ - 56]

的EBCDIC值
public static void main(String[] args) throws UnsupportedEncodingException {
    String str = "H";
    byte[] b1 = new byte[10];
    b1 = str.getBytes("Cp1047");
    System.out.println(Arrays.toString(b1));

    for (byte b : b1) {
        System.out.println(b);
    }

    b1 = str.getBytes("UTF-16");
    System.out.println(Arrays.toString(b1));

    b1 = str.getBytes();
    System.out.println(Arrays.toString(b1));
}

1 个答案:

答案 0 :(得分:4)

在你的循环中

for (byte b : b1)
   System.out.println(b);  

Java将符号扩展为b(一个字节),当它将其提升为一个整数时,会导致打印0xFFFFFFC8的值。 0xFFFFFFC8是签名号码-56的两个补码表示。见this。您可以通过执行以下操作来阻止符号扩展:

for (byte b  :b1)
  System.out.println(b & 0xFF);  

这将导致打印值0xC8(十进制为200)。