Как я могу воспроизвести распаковку Perl в C #? - PullRequest
4 голосов
/ 08 октября 2008

Я пытаюсь воссоздать Perl-скрипт в C #, но у меня возникла проблема при создании значения контрольной суммы, которое требуется целевой системе.

В Perl эта контрольная сумма рассчитывается с использованием функции unpack:

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

где PACKAGE - поток ввода файла .tar

Мне нужно повторить это в C #, но я не могу найти средство для репликации этой unpack функции.

Вся помощь приветствуется!

(я знаю, что есть намного лучшие вычисления контрольной суммы, но не может изменить целевую систему, поэтому не может изменить расчет)

Ответы [ 5 ]

6 голосов
/ 08 октября 2008

Кажется, в Mono есть библиотека с именем DataConvert , которая была написана для предоставления средств, аналогичных Perl pack / unpack. Делает ли это то, что вам нужно?

4 голосов
/ 08 октября 2008

В дополнение к комментарию Митча Уайта, вот реализация Java (которая делает только один блок). Я уверен, что вы найдете способ преобразовать его в C # и сделать несколько блоков.

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

Надеюсь, это поможет!

4 голосов
/ 08 октября 2008

Распаковка Perkl описана здесь и здесь . Исходя из этого, вы должны быть в состоянии написать эквивалент в C #.

0 голосов
/ 10 марта 2015

Основываясь на комментариях Криса Джестера-Янга и ПиКуки, я разработал следующую функцию. Я надеюсь, что вы найдете это полезным.

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;  
}
0 голосов
/ 09 октября 2008

В моем тестировании распаковка с% 32C представляется суммой байтов, ограниченной 32 битами.

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

Это не должно быть трудно воспроизвести это.

...