以下代码(这是一个简化版本)用于在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会不会有什么坏处: - )
答案 0 :(得分:2)
不,行为没有从1.6变为1.7 - 或者,就此而言,从1.0变为1.7。
执行以下代码行时:
char c = (char) buffer.get();
您正在有效地执行以下步骤:
byte
值int
。负值以二进制补码形式表示。char
。这将简单地屏蔽高位两个字节,因此二进制补码整数将是一个“大”字符值。在您的情况下,可能发生的事情是数据格式已发生变化,因此您未达到预期的目的。看看其余的代码,你正在阅读的“字符”似乎应该是简单的ASCII值。
答案 1 :(得分:1)
字节的值范围为-128到+127(8位有符号) char的值范围为0到+65535(16位无符号) 如果你不将“c”投射到一个字符上就可以了。
答案 2 :(得分:0)
是的,这是可能的。 char范围是0到65535,字节范围是-128到127。 所以
如果将字节少于0转换为char,则表示数据错误
如果你将-128到127之间的smth转换成字节,你将得到错误的值