2008-10-08 7 views
4

C#에서 Perl 스크립트를 다시 만들려고하는데 대상 시스템에 필요한 체크섬 값을 만드는 데 문제가 있습니다.C#에서 Perl의 압축 해제 기능을 어떻게 복제 할 수 있습니까?

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

PACKAGE

제가 C#으로이를 복제해야하지만하는 방법을 찾을 수없는 .tar 파일 입력 스트림에게이다

펄 이것은 체크섬 unpack 함수를 사용하여 계산된다 그 복제는 unpack입니다.

모두에게 감사드립니다!

답변

6

모노의 도서관과 유사한 기능을 제공하기 위해 작성되었습니다 그 DataConvert라는이있는 것 같습니다 (I가 가능 훨씬 더 체크섬 계산은하지만 계산을 변경할 수 있도록 대상 시스템을 변경할 수 없습니다 알고) 펄의 포장/포장 풀기. 이것이 당신이 필요로하는 것을합니까?

+1

OP가이 질문으로 인터넷을 스팸했습니다. 분명히 그는 CodeProject에 대한 조언을 이미 제안했기 때문에 대답을 찾고 있지 않습니다. – leppie

+0

불행히도 나는 대안을 찾고 있으므로 사용중인 서버에 dataconvert 라이브러리를 설치할 수 없습니다. 나는 7 개의 포럼에서 인터넷에 스팸을 보내는 질문을하고 싶지 않습니다. 제 가정은 각 포럼마다 다른 독자가 있어야하고 각자 다른 응답을받을 것입니다. –

4

퍼크의 포장 풀기는 herehere으로 기재되어있다. 그로부터 당신은 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

예, 파일이 있기 때문에 문제가있는 것 같습니다. 타르는 거기에 비표준 아스키 문자를 가지고 있고 이것들은 펄 스크립트와 함께 C# 스크립트에서 다른 결과를 던집니다. 이유를 판단 할 수 없습니다. –

+0

두 경우 모두 바이너리 모드를 보장합니까? "tar"형식의 파일 형식과 관계없이 이진 형식 (비 변환 또는 비 ASCII) 모드에서 한 번에 한 바이트를 읽는 것은 언어에 관계없이 동일한 바이트를 제공해야합니다. – piCookie

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