2016-10-26 14 views
0

こんにちは、C#アプリケーションをアンドロイドに変換し、C#と同じバイト配列からチェックサムを計算しています。しかし、それはバイト配列の下で間違った値を返します。誰でもこれを手伝ってください。ありがとう。チェックサムの計算がアンドロイドの間違った値を返します

C#バイト配列:

[41、132、41、132、41、132、41、132、41、132、41、132、41、132、41、132、41、132、41 、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132 、41、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132,41 、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132 、41、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132,41 、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132 、41、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41 、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132 、41、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132,41 、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132 、41、132、41、132、41、132、41、132、41,132,41,132,41,132,41,132,41,132,41,132,41,132,41,132,41 、132、41、132、41、132、41、132、41、132、41、132、41、132、41、132]

C#コード:

public static uint CalculateChecksum(byte[] buffer, int offset, int length) 
     { 
      uint cs = 0; 
      for (int i = offset; i < offset + length & i < buffer.Length; i += 2) 
      { 
       ushort s = BitConverter.ToUInt16(buffer, i); 
       cs += s; 
      } 

      return cs; 
     } 

値取得4736620この変換値からバイト配列に[108,70,72,0]が返される

アンドロイドバイト配列

[41、-124、41、-124、41、-124、41、-124、41、-124、41、-124、41、-124、41、-124 41、-124、41、-124、41、-124,41、-124、41、-124、41、-124、41、-124、41、-124、41、-124、41、-124 41、-124、41、-124、41、-124,41、-124、41、-124、41、-124、41、-124、41、-124、41、-124、41、-124 41、-124、41、-124、41、-124,41、-124、41、-124、41、-124、41、-124、41、-124、41、-124、41、-124 41、-124、41、-124、41、-124,41、-124、41、-124、41、-124、41、-124、41、-124、41、-124、41、-124 41、-124、41、-124、41、-124,41、-124、41、-124、41、-124、41、-124、41、-124、41、-124、41、-124 41、-124、41、-124、41、-124,41、-124、41、-124、41、-124、41、-124、41、-124、41、-124、41、-124 41、-124、41、-124、41、-124,41、-124、41、-124、41、-124、41、-124、41、-124、41、-124、41、-124 、41、-124、41、 -124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、 -124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、 -124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、 -124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、 -124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、 -124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、-124,41、 -124]

アンドロイドコード:

public static long checkSum(byte[] buffer, int offset, int length) { 
     long cs = 0; 
     for (int i = offset; i < offset + length & i < buffer.length; i += 2) { 

      ByteBuffer bb = ByteBuffer.allocate(2); 
      bb.order(ByteOrder.LITTLE_ENDIAN); 
      bb.put(buffer[i]); 
      bb.put(buffer[i+1]); 
      long shortVal = bb.getShort(0); 

      cs += shortVal; 
     } 
     return cs; 
    } 

値取得-4438420このヴァル変換バイト配列にUE

ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt((int) value).array(); 

は[108,70、-68、-1]間違って何をして

をやっていますか?なぜその戻り値が異なるのですか? 私を助けてください。ありがとうございました。

答えて

0

バイト配列の内容が異なります(たとえば、2番目の位置がC#ではAndroidと異なります)。だから私の見地からは、コードが異なるチェックサムを返すことは間違いありません。

編集:実際に配列の内容が異なります。 1つは、符号なしバイトのもう1つの符号なしバイトで構成されます。これは違いです(たとえビット表現が同じであっても)ビッグエンディアン対リトルエンディアンとは関係ありません。あなたが直面している問題は、Javaバージョンでは、署名付きショートをもう一度使用していますが、C#バージョンではunsigned shortを使用していたからです。そこでは、符号は、2^16の倍数である項によって計算を間違ってしまいます。実際、C#でsigned int16を使用していた場合、Androidソリューションと同じ結果が得られます。

したがって、単純な解決策は、後者が署名されているため、短いではなくバイトバッファから整数を要求することです。

public static long checkSum(byte[] buffer, int offset, int length) { 
    long cs = 0; 
    for (int i = offset; i < offset + length & i < buffer.length; i += 2) { 

     ByteBuffer bb = ByteBuffer.allocate(2); 
     bb.order(ByteOrder.LITTLE_ENDIAN); 
     bb.put(buffer[i]); 
     bb.put(buffer[i+1]); 
     long shortVal = bb.getShort(0); 
     if (shortVal < 0) { shortVal += (1 << 16); } 
     cs += shortVal; 
    } 
    return cs; 
} 
+0

そのバイト配列を意味ビッグエンディアン形式(-124 + 256 = 132)であった。代わりに、短いは(USHORTになることはありませんができる)が負である場合に^ 16 2を追加することができます。その理由は、LittleEndian形式の戻り値とバイト配列をJavaバイト配列で取得するのは、C#の符号なし(0〜256)であることです(-127から127)。 – Nas

+0

@Nas値が符号付きであるかどうかの違いは価値の違いは、まだ。 – Georg

+0

例えば、2番目のポジションは132 amにする必要がありますか? – Nas