3

缓冲区是一个字节缓冲区。我因此而失去了精确度错误。

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

谢谢你的帮助。

4

2 回答 2

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 不支持无符号整数?有关 Java 中不存在无符号数据类型的一些好的背景信息

于 2012-12-13T06:42:23.880 回答
1

你是对的:Java“字节”是一个介于 -127 和 127 之间的有符号数。

解决方案是简单地转换为“short”或“int”。

例子:

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”保留为“字节”,则只需在 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 都是相同的:导致编译错误的是它们的含义。

于 2012-12-13T06:38:48.483 回答