2011-12-07 2 views
0

ソケットのInputStreamを介して14バイトのメッセージを受信して​​います。 これらは次のようになります。a55a0b051000000000223664300c これらは特定のパターンを持っています。最初の2バイトは同期のためのもので、常に一定です。文字列で文字列を処理し、情報を抽出します。ネストされたif文を避けるには?

私はこのメッセージを確認する最良の方法をお探ししています。 最初の14バイトの長さを検証しなければならず、その後、最初の2バイトなど

これは今まで私のアプローチです:

public void handleMessage(String msg){ 

    if(msg.length() == 14){ 
     if(msg.substring(0, 1).equals("a5") && msg.substring(2, 3).equals("5a")){ 

      //Determine tpye 
      if(msg.substring(4, 5).equals("0b")){ 

       //Type = 05 
       if(msg.substring(6, 7).equals("05")){ 

        if(msg.substring(8, 15).equals("0b")){ 

        } 
       } 

      } 
      else if(msg.substring(4, 5).equals("6b")){ 
       //Type = 05 
       if(msg.substring(6, 7).equals("05")){ 

        if(msg.substring(8, 15).equals("0b")){ 

        } 
       } 
      } 
      else if(msg.substring(4, 5).equals("4b")){ 
       // ... 
      } 
      else if(msg.substring(4, 5).equals("ab")){ 
       // ... 
      } 
      else System.out.println("Error: telegram type"); 

     }else System.out.println("Error: Sync Bytes."); 



    }else System.out.println("Error: Telegram length."); 



} 

しかし、私はこれらすべてのネストされたIFSと冗長を避けたいですコードが付属しています。 より効率的な方法で文字列を処理する方法に関するアイデアはありますか? ありがとう!

+0

その後、より読みやすいよう最初、私は文字列でそれを置かないと思いますが賢明かもしれない、バイトが[]も良いです(そしてあなた文字列を比較する代わりに 'if(input [0] == 0xA5 && input [1] == 0xA5)'を使うことができます –

答えて

1

私はあなたが

する必要がない場合、文字列に変換しないコメントで言ったようにあなたはガードの原因を反転し、それらのインデント

を避けるために、そこに早期復帰を置くことができます最初のトップレベルのスイッチは、これは(タイプミスが起こりにくい)のif-elseカスケード

public void handleMessage(byte[] msg, int off){ 
    if(msg.length()-off < 14){//just use the first 14 after offset   System.out.println("Error: Telegram length."); 
     return; 
    } 
    if(msg[0+off]!=0xa5 || msg[0+off]!=0xa5){ 
     System.out.println("Error: Sync Bytes."); 
     return; 
    } 
    //Determine tpye 
    switch(msg[2+off]){ 
    case 0x0b: 
     if(msg[3+off]==0x05){ 

      if(msg[4+off]==0x0b){ 
      } 

     } 
     break; 
    case 0x6b: 
     if(msg[3+off]==0x05){ 

      if(msg[4+off]==0x0b){ 

      } 
     } 
     break; 
    case 0x4b: 
     //... 
     break; 
    case 0xab: 
     //... 
     break; 
    default:System.out.println("Error: telegram type"); 
     break; 
    } 
} 
+0

すばらしいアプローチ!ありがとう!しかし、1つの質問:なぜeclipseは0xabをバイトにキャストすることを提案していますか?ちょうど0xabです。 0x4bと0x6bは受け入れます。どうも! – tzippy

+0

Oxabが127(0x7f)より大きいため、バイトの最大値 –

+0

しかし、どのように符号なしバイトを使用できますか? – tzippy

1

あなたは、パフォーマンス上の問題を指している有形メトリックを持っていない限り、私は効率上の読みやすさに焦点を当てます。

コードをより読みやすくするために、適切な名前で一連のメソッド呼び出しをリファクタリングし、各メソッドの検証責任を特定し、ネストされたifではなく複数の戻り値を使用できます。また

関連する問題