2

我创建了一个简单的应用程序,如下所示:

    String stringValue = new String(new byte[] { 0x00, 0x00, 0x00, 0x25 }, "273");
    byte[] valueEncoded = Arrays.copyOfRange(stringValue.getBytes("273"), 0, 4);
    int finalResult = ByteBuffer.wrap(valueEncoded).getInt();
    
    System.out.println("Result: "+finalResult);

我希望结果是 37,但结果是 21。怎么会?我错过了什么吗?或者我的方法不是它应该的方式,因此会弹出这个错误?

我尝试了许多其他数字,似乎一切正常......如您所见,我使用的是代码页 273 (IBM)。

4

1 回答 1

2

在我看来,换行符 0x25 已映射到换行符 0x15。

我假设它是这样的:

字节到字符串:EBCDIC 0x25 -> UTF-16 0x000A

字符串到字节:UTF-16 0x000A -> EBCDIC 0x15。

为什么这是首选,我猜不出来。好吧,实际上我可以猜到(但这只是一个猜测)。0x000A 是许多系统上的标准行终止符,但通常输出为“移至下一行的开头”。转换为 IBM 273 是“可能的”,因为文本注定要在使用该代码页的设备上输出,并且可能此类设备需要 NL 而不是 LF 来开始新行。


假设验证:

 class D {
   public static void main(String... a) throws Exception {
       String lf = "\n";
       byte[] b = lf.getBytes("273");
       System.out.println((int)b[0]);
   }
}

输出为 21。

于 2021-06-13T19:55:21.473 回答