2008-10-08 3 views
4

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

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

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

где PACKAGE является входным потоком файла .tar

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

Вся помощь оценивается!

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

ответ

6

Там, кажется, библиотека Mono называется DataConvert, что было написано, чтобы обеспечить условия, аналогичные Пакет/распаковка Perl. Делает ли это то, что вам нужно?

+1

ОП запросил Интернет по этому вопросу. Очевидно, он не ищет ответов, поскольку я уже предлагал вам совет по CodeProject. – leppie 2008-10-08 11:35:46

+0

К сожалению, я не могу установить библиотеку dataconvert на сервере, который мы используем, поэтому я ищу альтернативы. Я бы не сказал, что задавать вопрос на 7 форумах - это спам в Интернете. Я предполагал, что каждый форум будет иметь разные читатели, и я получаю разные ответы от каждого. – 2008-10-08 15:14:25

4

Опечатка Perkl описана here и here. Из этого вы должны иметь возможность написать эквивалент в C#.

4

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

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

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

0

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

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

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

0

Основываясь на комментариях Криса Джет-Юнга и 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; 
}