3

buffer は 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 までのバイト値を許可しているようです。これは符号付きの値に問題があるようですが、その理由はわかりません。

助けてくれてありがとう。

4

2 に答える 2

3

コメントですでに述べたように、バイトは[-128..127]です。

想定している(Javaには存在しない)「符号なしバイト」の範囲を維持するために、バイトをバイトバッファからintに変換する必要があります。

  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がunsignedintをサポートしないのはなぜですか?を参照してください。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」を「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は同じです。コンパイルエラーの原因はそれらの意味です。

于 2012-12-13T06:38:48.483 に答える