Java中的字节与十六进制

时间:2012-12-13 06:31:53

标签: java byte bytebuffer

缓冲区是一个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.这似乎是有符号值的问题,但我不知道为什么。

感谢您的帮助。

2 个答案:

答案 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都是相同的:它们的意思是导致编译错误。