3

署名付きまたは署名なしを に変換するこのメソッドがありますbyteint、返されるはずのものが返されません。誰かが以下のコードの問題を指摘できますか?

public int convertByteToInt(byte[] b){          
    int value= 0;
    for(int i=0;i<b.length;i++){                
    int n=(b[i]<0?(int)b[i]+256:(int)b[i])<<(8*i);             
        value+=n;
    }         
    return value;       
}

編集:

SNR を計算するために実際に wav ファイルを読み込んでいます。変換から返された値は、0 から 255 の間の値になるはずです。アプリケーションは、元のファイルと変更されたファイルの 2 つの wave ファイルを比較し、SNR を計算する必要があります。

4

6 に答える 6

8

回答ありがとうございますが、問題は変換方法ではなく、別の場所にあることがわかりました。

メソッドの別のバージョンがあります

public int convertirOctetEnEntier(byte[] b){    
    int MASK = 0xFF;
    int result = 0;   
        result = b[0] & MASK;
        result = result + ((b[1] & MASK) << 8);
        result = result + ((b[2] & MASK) << 16);
        result = result + ((b[3] & MASK) << 24);            
    return result;
}
于 2011-02-09T23:48:49.947 に答える
6

これで、int に変換するビッグ エンディアンのバイト配列ができました。各バイトの値が何であるかは問題ではないと思います。それらをすべてくっつけるだけです:

public int convertByteToInt(byte[] b)
{           
    int value= 0;
    for(int i=0; i<b.length; i++)
       value = (value << 8) | b[i];     
    return value;       
}

ここで何か不足している場合は、お知らせください。

于 2011-02-09T21:29:29.307 に答える
4

演習としてコードを書いていますか、それともその方法を探しているだけですか? 後者の場合は、ByteBufferを使用することをお勧めします。トリックを行う getInt メソッドがあります。

于 2011-02-09T21:28:49.570 に答える
0

256 を加算する場合、左にシフトするのを忘れたようです。

また、リトルエンディアン byte[] を想定しています (そして、それが 4 バイト以下であることを検証したい場合があります)。

于 2011-02-09T21:29:26.603 に答える
0
public static String bytesToString(byte[] b) {
   try {
      return new String(b, "UTF-8");
   }

   catch (UnsupportedEncodingException ex) {
      Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
   }

   return null;
}

private int toInt(byte[] b1){
    String s1 = bytesToString(b1);
    int y = Integer.parseInt(s1);
    return y;
}

このコードは完全に機能します。コード例を見つけていましたが、何も機能しません。これを行います。

于 2016-05-26T01:24:36.583 に答える
0

DatatypeConverterをお勧めします。これには、必要なものに導くことができる複数の機能があります

于 2016-05-26T01:50:16.920 に答える