2

ファイルと彼のチェックサム(cksum Unixコマンドによって生成された)をダウンロードします。

したがって、C#アプリのテストで、チェックサムがダウンロードしたアプリと適切であるかどうかを確認します。

chsumのUnixのマニュアルページで確認しました。

  The cksum command calculates and prints to standard output a checksum
  for each named file, the number of octets in the file and the
  filename.

  cksum uses a portable algorithm based on a 32-bit Cyclic Redundancy
  Check.  This algorithm finds a broader spectrum of errors than the
  16-bit algorithms used by sum (see sum(1)).  The CRC is the sum of the
  following expressions, where x is each byte of the file.

       x^32 + x^26 + x^23 +x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7
       + x^5 + x^4 + x^2 + x^1 + x^0

  The results of the calculation are truncated to a 32-bit value.  The
  number of bytes in the file is also printed.

だから私は合計を行う簡単なプログラムを書きました:

byte[] arr = File.ReadAllBytes(@"MyApp").ToArray();

int cksum = 0;

foreach (byte x in arr)
{
    cksum += (x ^ 32 + x ^ 26 + x ^ 23 + x ^ 22 + x ^ 16 + x ^ 12 + x ^ 11 + x ^ 10 + x ^ 8 + x ^ 7 + x ^ 5 + x ^ 4 + x ^ 2 + x ^ 1 + x ^ 0);
}

しかし、チェックサムは同じではありません。どうすればこれを修正できますか?

ありがとう


編集

1)変更されたアルゴリズムは次のとおりです。

uint cksum = 0;

foreach (byte b in arr)
{
    var x = (uint)b;

    cksum += (IntPow(x, 32)
        + IntPow(x, 26) + IntPow(x, 23) + IntPow(x, 22)
        + IntPow(x, 16) + IntPow(x, 12) + IntPow(x, 11) + IntPow(x, 10)
        + IntPow(x, 8) + IntPow(x, 7) + IntPow(x, 5) + IntPow(x, 4) + IntPow(x, 2) + IntPow(x, 1) + IntPow(x, 0));
}

2)私は使用しましたclass Crc32 : HashAlgorithm

Crc32が:2774111254であるUnixファイルがあるとします。

  • 1)私に与える:4243613712
  • 2)私に与える:3143134679(シード0)

私が間違っていること!?

4

4 に答える 4

2

それらは力であり、xorsではありません。CRCについてはウィキペディアを参照してください。

于 2011-07-12T08:41:00.417 に答える
2

C#では、^は累乗演算子ではなく、xor演算子ですが、CRCは、どの言語にも固有ではない一般的な数学用語を使用して記述されています。

標準の「pow」関数も使用しないでください。これらは通常、浮動小数点を使用してx^32などの非常に大きな数を表します。

一方、必要なのは、回答の下位32ビットを維持することです。おそらく最善の方法は次のとおりです。

  • 独自の整数べき関数を記述します。この関数は、引数をIntとして受け取り、x N回の乗算を実行し、.NETランタイムが適度に効率的であると信頼して(または、遅すぎる場合は、実行するなどの最適化を使用して、x ^Nを計算します)。二乗による指数)。剰余またはビット単位の演算子を使用して各倍数の後に四捨五入するか、チェックされていない値を使用してそれらを信頼し、毎回下位32ビットをラップして維持することにより、数値が大きくなりすぎないようにしてください。
  • CRC32を直接計算するライブラリまたは既存のコードを探します(例:http://www.google.co.uk/search? q = c%23 + crc32 )
于 2011-07-12T08:49:39.373 に答える
2

C#では、^記号は排他的論理和演算子です。関数Math.Powが必要です。

これにより、2つの浮動小数点数のパイオワーが得られます。代替案は、C#で*整数*のべき乗をどのように行うかで提案されています。

したがって、コードは次のようになります。

cksum += Math.pow(x,32) + Math.pow(x,26)

最後のステートメントにも注意してください。

計算結果は32ビット値に切り捨てられます。ファイルのバイト数も出力されます。

これはint符号付き()または符号なし()uintですか

もちろん、次を使用することもできます:http: //www.codeproject.com/Articles/35134/How-to-calculate-CRC-in-C

于 2011-07-12T08:49:47.963 に答える
2

この正しい実装も参照してくださいhttps://cksum.codeplex.com/

于 2014-10-07T00:24:07.713 に答える