如何在C#中复制Perl的解包功能?

时间:2008-10-08 11:28:20

标签: c# perl unpack

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

在Perl中,使用unpack函数计算校验和:

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

其中PACKAGE是.tar文件输入流

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

所有帮助表示赞赏!

(我知道有更好的校验和计算可用,但无法更改目标系统,因此无法更改计算)

5 个答案:

答案 0 :(得分:6)

Mono中似乎有一个名为DataConvert的库,用于提供与Perl的打包/解包相似的工具。这样做你需要的吗?

答案 1 :(得分:4)

Perkl的解压包描述为herehere。从那以后你应该能够用C#编写一个等价物。

答案 2 :(得分:4)

为了补充Mitch Wheat的评论,这里是一个Java实现(仅执行一个块)。我相信你会找到一种方法将它转换成C#,并做多个块。

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

希望这有帮助!

答案 3 :(得分:0)

在我的测试中,使用%32C解包似乎是字节的附加和,限制为32位。

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

重现它应该不难。

答案 4 :(得分: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;  
}