缓冲区是一个bytebuffer。我得到了一个丢失的percision错误。
byte myPort = buffer.get(0); // Might need to change this depending on byte order
switch(myPort){
case 0xF1: // Chat service
break;
case 0xF2: // Voice service
break;
case 0xF3: // Video service
break;
case 0xF4: // File transfer service
break;
case 0xF5: // Remote login
break;
}
显然,0xFF在java中不是一个字节,它让我很困惑。我不知道我是否会丢失它但是不是0xF是半字节而是0xFF一个字节?显然我的ide netbeans允许字节值一直到127.这似乎是有符号值的问题,但我不知道为什么。
感谢您的帮助。
答案 0 :(得分:3)
如评论中所述,字节为[-128 .. 127]。
您应该将字节从字节缓冲区转换为int,以保留您假设的“无符号字节”范围(以及Java中不存在的范围):
int myPort = buffer.get(0) & 0xff; // Might need to change this depending on byte order
switch(myPort){
case 0xF1: // Chat service
break;
case 0xF2: // Voice service
break;
case 0xF3: // Video service
break;
case 0xF4: // File transfer service
break;
case 0xF5: // Remote login
break;
}
请注意,由于符号扩展,简单地将字节分配给int将不起作用:
byte val = (byte) 0xb6;
int myPort = val;
会产生myPort = -74 (0xffffffb6)
,而
byte val = (byte) 0xb6;
int myPort = val & 0xff;
结果为myPort = 182 (0xb6)
。
有关Java中缺少无符号数据类型的一些好的背景信息,请参阅Why doesn't Java support unsigned ints?
答案 1 :(得分:1)
你是对的:Java“byte”是-127到127之间的带符号数字。
解决方案只是转换为“短”或“整数”。
实施例
int myPort = buffer.get(0); // Might need to change this depending on byte order
switch(myPort){
case 0xF1: // Chat service
break;
case 0xF2: // Voice service
break;
case 0xF3: // Video service
break;
case 0xF4: // File transfer service
break;
case 0xF5: // Remote login
break;
}
如果您希望将“myPort”保留为“byte”,则只需在switch语句中强制转换为int:
实施例
byte myPort = buffer.get(0); // Might need to change this depending on byte order
switch(0xff & (int)myPort){
case 0xF1: // Chat service
break;
...
无论哪种方式,BITS都是相同的:它们的意思是导致编译错误。