4

我正在尝试在 C# 中重新创建 Perl 脚本,但在创建目标系统所需的校验和值时遇到问题。

在 Perl 中,此校验和是使用以下unpack函数计算的:

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

PACKAGE.tar 文件输入流在哪里

我需要在 C# 中复制它,但找不到复制该unpack函数的方法。

所有帮助表示赞赏!

(我知道有更好的校验和计算可用,但不能改变目标系统所以不能改变计算)

4

5 回答 5

6

Mono 中似乎有一个名为DataConvert的库,它被编写为提供类似于 Perl 的打包/解包的工具。这能满足您的需要吗?

于 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 解包似乎是字节的加法总和,限制为 32 位。

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

重现它应该不难。

于 2008-10-08T21:49:02.410 回答
0

Based on the comments of Chris Jester-Young and piCookie, I developed the following function. I hope you find it useful.

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 回答