チェックサムアルゴリズムに取り組んでいますが、いくつか問題があります。キッカーは、受信している「実際の」データよりも大幅に小さい「偽の」メッセージを手作りすると、正しいチェックサムが得られることです。ただし、実際のデータに対しては、チェックサムが正しく機能しません。
着信データ/環境に関する情報を次に示します。
- これはグルーヴィーなプロジェクトです (以下のコードを参照)
- チェックサムの計算では、すべてのバイトが符号なし整数として扱われます
- それを機能させるために、ショートパンツとロングパンツを少し調整することに気付くでしょう.
- 実データのサイズは 491 バイトです。
- サンプル データ (正しく追加されているように見える) のサイズは 26 バイトです。
- 私が知る限り、16 進数から 10 進数への変換で負の数が生成されることはありません
- ファイル内の一部のバイトはチェックサムに追加されません。これらのスイッチが適切に機能していること、およびそれが想定されている場合であることを確認しました-したがって、それは問題ではありません.
- 私が計算したチェックサムと、実際の送信に同梱されているチェックサムは、常に同じ量だけ異なります。
- 実際のデータと一緒にパッケージ化されたチェックサムが正しいことを手動で確認しました。
コードは次のとおりです。
// add bytes to checksum
public void addToChecksum( byte[] bytes) {
//if the checksum isn't enabled, don't add
if(!checksumEnabled) {
return;
}
long previouschecksum = this.checksum;
for(int i = 0; i < bytes.length; i++) {
byte[] tmpBytes = new byte[2];
tmpBytes[0] = 0x00;
tmpBytes[1] = bytes[i];
ByteBuffer tmpBuf = ByteBuffer.wrap(tmpBytes);
long computedBytes = tmpBuf.getShort();
logger.info(getHex(bytes[i]) + " = " + computedBytes);
this.checksum += computedBytes;
}
if(this.checksum < previouschecksum) {
logger.error("Checksum DECREASED: " + this.checksum);
}
//logger.info("Checksum: " + this.checksum);
}
このアルゴリズムで、予想される結果からのずれを引き起こしている可能性のあるものを誰かが見つけた場合は、これを追跡するためにあなたの助けをいただければ幸いです.