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

Odpowiedz Nowy wątek
2015-01-08 14:44
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?

Pozostało 580 znaków

2015-01-08 14:47
1

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2015-01-08 14:49
0

2323

LOL! To był sarkazm! Ta zmienna nie ma nadanej wartości i na tym polega problem, używasz wartości, która jest przypadkowa, co prowadzi do błędu (dziwne, że nie do crasha). Dodaj kompilatorowi opcję -Wall a od razu wytknie ci ten błąd. - MarekR22 2015-01-08 14:53

Pozostało 580 znaków

2015-01-08 14:52
0

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

Pozostało 580 znaków

2015-01-08 14:52
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);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-08 15:34
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.

Pozostało 580 znaków

2015-01-08 15:49
0

Po kiego ci ta druga pętla?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-08 16:12
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");
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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