4

C# で Perl スクリプトを再作成しようとしていますが、ターゲット システムが必要とするチェックサム値の作成に問題があります。

Perl では、このチェックサムは次のunpack関数を使用して計算されます。

while (<PACKAGE>) {
    $checksum += unpack("%32C*", $_);
}
$checksum %= 32767;
close(PACKAGE);

PACKAGE.tar ファイルの入力ストリームはどこですか

unpackこれを C# で複製する必要がありますが、その関数を複製する手段が見つかりません。

すべての助けに感謝します!

(はるかに優れたチェックサム計算が利用できることは知っていますが、ターゲット システムを変更できないため、計算を変更することはできません)

4

5 に答える 5

6

Perl のパック/アンパックと同様の機能を提供するために作成されたDataConvertと呼ばれる Mono のライブラリがあるようです。これはあなたが必要とすることをしますか?

于 2008-10-08T11:32:22.093 に答える
4

Perkl のアンパックについては、こちらこちらで説明しています。それから、C# で同等のものを記述できるはずです。

于 2008-10-08T11:33:15.023 に答える
4

Mitch Wheat のコメントを補足するために、ここに Java 実装を示します (これは単一のブロックのみを実行します)。それを C# に変換し、複数のブロックを実行する方法が見つかると確信しています。

int sum = 0;
for (byte b : buffer) {
    sum += (int) b & 255;
}
return sum % 32767;

お役に立てれば!

于 2008-10-08T11:36:04.363 に答える
0

ここでの私のテストでは、%32C を使用した unpack は、32 ビットに制限されたバイトの加算合計であるように見えます。

print unpack("%32C*", 'A');
65
print unpack("%32C*", 'AA');
130

それを再現するのは難しくないはずです。

于 2008-10-08T21:49:02.410 に答える
0

Chris Jester-Young と piCookie のコメントに基づいて、次の関数を開発しました。お役に立てば幸いです。

int fileCheckSum(const char *fileName)
{
   FILE *fp;
   long fileSize;
   char *fileBuffer;
   size_t result;
   int sum = 0;
   long index;

   fp = fopen(fileName, "rb");
   if (fp == NULL)
   {
      fputs ("File error",stderr); 
      exit (1);
   }

   fseek(fp, 0L, SEEK_END);
   fileSize = ftell(fp);
   fseek(fp, 0L, SEEK_SET);

   fileBuffer = (char*) malloc (sizeof(char) * fileSize);   
   if (fileBuffer == NULL)
   {
      fputs ("Memory error",stderr);
      exit (2);
   }

   result = fread(fileBuffer, 1, fileSize, fp);   
   if (result != fileSize)
   {
      fputs ("Reading error", stderr);
      if (fileBuffer != NULL)
         free(fileBuffer);

      exit (3);
   }

   for (index = 0; index < fileSize; index++)
   {
      sum += fileBuffer[index] & 255;
   }

   fclose(fp);
   if (fileBuffer != NULL)
      free(fileBuffer);

   return sum % 32767;  
}
于 2015-03-10T12:56:49.157 に答える