1

この質問はすでに尋ねられている可能性がありますが、実際に必要な答えが得られたわけではありません。

他の誰かの vb.NET コードをリバース エンジニアリングしようとしXorていますが、ここで何をしているのかに行き詰まっています。解析される SOAP リクエストの本文の 1 行を次に示します (一部の値が隠されているため、この場合はチェックサムが機能しない可能性があります)。

<HD>CHANGEDTHIS01,W-A,0,7753.2018E,1122.6674N, 0.00,1,CID_V_01*3B</HD>

これは、それをチェックするvbコードのスニペットです

LastStar = strValues(CheckLoop).IndexOf("*")
StrLen = strValues(CheckLoop).Length
TransCheckSum = Val("&h" + strValues(CheckLoop).Substring(LastStar + 1, (StrLen - (LastStar + 1))))

CheckSum = 0
For CheckString = 0 To LastStar - 1
    CheckSum = CheckSum Xor Asc(strValues(CheckLoop)(CheckString))
Next '

If CheckSum <> TransCheckSum Then
    'error with the checksum
    ...

OK、Forループまで進めます。Xor の動作と、それがチェックサムにどのように使用されるかについての説明が必要です。

ありがとう。

PS: おまけとして、誰かが ac# の翻訳を提供できる場合は、私は非常に感謝しています.

4

2 に答える 2

2

を使用Xorすると、チェックサムを計算する簡単なアルゴリズムを使用できます。考え方はパリティ ビットを計算する場合と同じですが、バイト全体で 8 ビットが計算されます。CRC や MD5 などのより高度なアルゴリズムは、要求の厳しいアプリケーションのチェックサムを計算するためによく使用されます。

C# コードは次のようになります。

string value = strValues[checkLoop];

int lastStar = value.IndexOf("*");
int transCheckSum = Convert.ToByte(value.Substring(lastStar + 1, 2), 16);

int checkSum = 0;
for (int checkString = 4; checkString < lastStar; checkString++) {
  checkSum ^= (int)value[checkString];
}

if (checkSum != transCheckSum) {
  // error with the checksum
}

C# への変換に対応するために、コードにいくつかの調整を加えました。使用する変数を宣言し、ローカル変数にはパスカル ケースではなくキャメル ケースを使用しました。毎回コレクションから文字列を取得するのではなく、文字列にローカル変数を使用します。

VBValメソッドは、認識できない文字を検出すると解析を停止するため、フレームワーク メソッドを使用するために、チェックサムの長さを 2 文字と仮定して、 ."3B"ではなく文字列を解析できるようにしました"3B</HD>"

ループは 4 番目の文字から始まり、最初の をスキップし"<HD>"ます。これは、チェックサムを計算する必要があるデータの一部であってはなりません。

AscC#では、文字コードを取得する関数は必要ありません。 を にキャストcharするだけintです。

于 2013-03-03T12:39:01.167 に答える
0

コードは基本的に文字値を取得し、整合性をチェックするために Xor を実行しています。このページのパリティ チェック セクションに、操作の非常に優れた説明があります: http://www.cs.umd.edu/クラス/sum2003/cmsc311/Notes/BitOp/xor.html

于 2013-03-03T12:23:37.710 に答える