簡體   English   中英

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

[英]How can I replicate Perl's unpack functionality in C#?

我試圖在C#中重新創建一個Perl腳本,但是在創建目標系統所需的校驗和值時遇到問題。

在Perl中,使用unpack函數計算此校驗和:

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

其中PACKAGE是.tar文件輸入流

我需要在C#中復制它,但無法找到復制該unpack函數的方法。

所有幫助贊賞!

(我知道有更好的校驗和計算可用但不能改變目標系統因此無法改變計算)

Mono中似乎有一個名為DataConvert的庫,它是為了提供類似於Perl的打包/解包而設置的。 這樣做你需要的嗎?

這里這里描述 Perkl的解包。 從那以后你應該能夠在C#中編寫一個等價物。

為了補充Mitch Wheat的評論,這里是一個Java實現(僅執行一個塊)。 我相信你會找到一種方法將它轉換為C#,並做多個塊。

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

希望這可以幫助!

在我的測試中,使用%32C解壓縮似乎是字節的附加和,限制為32位。

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

重現這一點應該不難。

根據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;  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM