Program obliczający sumę kontrolną BSD dla podanego tekstu

0

Witam,

Potrzebuję zrobić program, który obliczał by sumę kontrolną BSD dla wpisanego tekstu. W internecie jest bardzo mało materiałów, ale natknąłem się na algorytm na stronie: http://en.wikipedia.org/wiki/BSD_checksum , który wygląda tak:

FILE *fp;                     /* The file handle for input data */
int ch;                       /* Each character read. */
int checksum = 0;             /* The checksum mod 2^16. */
 
while ((ch = getc(fp)) != EOF) {
    checksum = (checksum >> 1) + ((checksum & 1) << 15);
    checksum += ch;
    checksum &= 0xffff;       /* Keep it within bounds. */
}

Próbowałem skompilować poniższy kod w Dev C++, ale próba jest nieudana (program się zawiesza) .

#include <iostream>
using namespace std;

int main()
{

FILE *fp;                     /* The file handle for input data */
int ch;                       /* Each character read. */
int checksum = 0;             /* The checksum mod 2^16. */
 
while ((ch = getc(fp)) != EOF) {
    checksum = (checksum >> 1) + ((checksum & 1) << 15);
    checksum += ch;
    checksum &= 0xffff;       /* Keep it within bounds. */
}
}

Ma ktoś pomysł jak poprawnie zrobić ten program?

1

jaką wartość ma fp? Na wiki był tylko fragment kodu!

0

2323

0

to bylo pytanie retoryczne. fp jest wskaznikiem ale na nic nie pokazuje wiec oczywiscie ze sie crashuje. Jaki niby plik ma otwierac?

0

Zapisałbym to tak:

unsigned checksum=0;
...
fp=fopen("TelepatycznieOdebranaNazwaPliku.txt","r");
while((ch=getc(fp))!=EOF) checksum=((((checksum<<16)|checksum)>>15)+ch)&0xFFFF;
fclose(fp);
0

No więc kod wygląda tak:

#include <iostream>
using namespace std;

int main()
{

FILE *fp;                     /* The file handle for input data */
int ch;                       /* Each character read. */
unsigned checksum = 0;             /* The checksum mod 2^16. */

fp=fopen("fp.txt","r");
while((ch=getc(fp))!=EOF) checksum=((((checksum<<16)|checksum)>>15)+ch)&0xFFFF;
fclose(fp); 

while ((ch = getc(fp)) != EOF) {
    checksum = (checksum >> 1) + ((checksum & 1) << 15);
    checksum += ch;
    checksum &= 0xffff;       /* Keep it within bounds. */
}
cout << checksum;
system("Pause");
}

W pliku fp.txt jest wartość 2323, w rezultacie otrzymuje wartość sumy kontrolnej 755. Wszystko fajnie, ale po wpisaniu w konsoli linuksowej polecenia echo 2323 | sum dostaje wartość 32825 więc program coś przekłamuje.

0

Po kiego ci ta druga pętla?

0
_13th_Dragon napisał(a):

Po kiego ci ta druga pętla?

Fakt,

teraz wygląda to tak:

#include <iostream>
using namespace std;

int main()
{

FILE *fp;                     /* The file handle for input data */
int ch;                       /* Each character read. */
unsigned checksum = 0;             /* The checksum mod 2^16. */

fp=fopen("fp.txt","r");
while((ch=getc(fp))!=EOF) checksum=((((checksum<<16)|checksum)>>15)+ch)&0xFFFF;
fclose(fp); 
cout << checksum <<endl;

system("Pause");
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1