是否有可能在Java 7(byte)((char)ByteBuffer.get(X))!= ByteBuffer.get(X)?

时间:2013-05-16 14:48:29

标签: java java-7

以下代码(这是一个简化版本)用于在jdk1.6中正常运行,现在断言在jdk 1.7下失败。

ByteBuffer buffer = ...;
buffer.mark();
char c = (char) buffer.get();
buffer.reset();

switch(c) {
  ...
  case 'H':
    byte b = buffer.get(); 
    //Here I get -106 for b and 72 for (byte) c
    assert( b == ((byte) c) );
    break;
  ...
}

我读过oracle's compatibility page并没有找到任何可以解释它的内容。也许是utf8的5和6形式,但我不认为是这种情况。 它也可能是我正在调查的竞争条件,但我认为问问stackoverflow会不会有什么坏处: - )

3 个答案:

答案 0 :(得分:2)

不,行为没有从1.6变为1.7 - 或者,就此而言,从1.0变为1.7。

执行以下代码行时:

char c = (char) buffer.get();

您正在有效地执行以下步骤:

  1. 从缓冲区中检索byte
  2. 将该值转换为int。负值以二进制补码形式表示。
  3. 将该整数转换为char。这将简单地屏蔽高位两个字节,因此二进制补码整数将是一个“大”字符值。
  4. 在您的情况下,可能发生的事情是数据格式已发生变化,因此您未达到预期的目的。看看其余的代码,你正在阅读的“字符”似乎应该是简单的ASCII值。

答案 1 :(得分:1)

字节的值范围为-128到+127(8位有符号) char的值范围为0到+65535(16位无符号) 如果你不将“c”投射到一个字符上就可以了。

答案 2 :(得分:0)

是的,这是可能的。 char范围是0到65535,字节范围是-128到127。 所以

如果将字节少于0转换为char,则表示数据错误

如果你将-128到127之间的smth转换成字节,你将得到错误的值