チェックサムアルゴリズムで作業していますが、いくつか問題があります。私が受け取っている "実際の"データよりも実質的に小さい「偽の」メッセージを手に渡すと、キッカーは正しいチェックサムを取得します。しかし、実際のデータに対して、チェックサムは正しく機能しません。チェックサムアルゴリズムが予測不可能な結果を生成する
ここでは、着信データ/環境に関するいくつかの情報です:
- これは、すべてのバイトは、チェックサム計算の目的のために、符号なし整数として扱われるべきであるグルーヴィープロジェクト(以下のコードを参照してください)
-
-
です
- これを実現するには、短くて長いものがあります。
- 実際のデータのサイズは491バイトです。
- (正しく追加するために表示されます)私のサンプルデータのサイズは、私の進数と10進数の変換の26バイト
- なし私は、ファイルに
- いくつかのバイトを伝えることができる最善のように、負の数を、生産されていないですチェックサムに追加されません。私は、これらのスイッチが適切に動作していること、そしてそれが想定されていることを確認しました。それは問題ではありません。
- 私の計算チェックサムと、実際の送信と一緒にパッケージ化されたチェックサムは、常に同じ量だけ異なります。
- 実際のデータでパッケージ化されたチェックサムが正しいことを手動で確認しました。ここで
コードです:誰もが予想される結果からドリフトを引き起こしている可能性があり、このアルゴリズムで何かを見つけることができれば
// 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);
}
、私は非常にこれを追跡するのにあなたの助けをいただければ幸いです。
簡単な質問... md5、shaまたは他の証明されたハッシュアルゴリズムを使用してみませんか?つまり:http://groovyconsole.appspot.com/script/256001 –
あなたの実装の詳細を知ることなく、CRC、MD5、SHAなどのよく知られた確立された十分なチェックサムアルゴリズムを使用しているのはなぜですか?理想に近い) –
まず、どのチェックサムアルゴリズムが使用されているかを判断することはできません。だから、それは疑問な点です。私はプロトコルに準拠しなければなりません - それについてのオプションはありません。第二に、帯域幅を節約するために行われました。移動しているデータの量に応じて、このメソッドを使用すると実際のドル記号に変換されます。 –