moin moin
da ich mir meiner menschlickeit und somit auch meiner fehlbarkeit bewusst bin wuerde ich mich freuen wenn jemand mit ahnung mal ein beispiel fuer eine pruefsumme (adler32) posten koennte.
z.B. ein array der laenge 100 mit je einem 'b' gefuellt ergibt bei mir ap=0x8e012649 oder auch -1912527287
bleibt die frage ob das nu richtig, falsch oder ein bischen von beidem ist.
Die Zahl krieg ich mit meinem quick'n'dirty-Programm auch raus.
z.B. ein array der laenge 100 mit je einem 'b' gefuellt ergibt bei mir ap=0x8e012649 oder auch -1912527287
Kann ich bestätigen. Interessant wird es natürlich erst bei sehr langen Arrays, weil dann die 32-Bit-Register überlaufen können (wenn man das nicht entsprechend behandelt).
Bei einem 1.000.000 Byte grossen Array mit a
= i & 0xFF erhalte ich 0e27d8d8 als Prüfsumme.
(Im Array steht also 0, 1, 2, 3, …, 253, 254, 255, 0, 1, 2, 3, …)
habt dank nun kann ich wieder beruhigt schlafen…
Hmmm,
wir bekommen mit 100 'b' das gleiche wie im ersten Post heraus. Also scheint unsere Adlerfunktion ja zu laufen. Aber mit Freds Beispiel bekommen wir was anderes heraus.
Unser Code fuer Freds Beispiel:
char a;
for(int i=0;i<1000000;i++) {
a[i] = i & 0xFF;
}
int n = 1000000;
result = adler32(a, n);
printf("Result: %x\n", result);
Unser Ergebnis: 0x5bea6678
Bist Du sicher, dass dein Programm richtig ist, Fred? :)
Robert, Jan und David
wir bekommen mit 100 'b' das gleiche wie im ersten Post heraus. Also scheint unsere Adlerfunktion ja zu laufen.
Anhand eines Beispiels soll die Korrektheit bewiesen sein? Gewagte These [img]
http://www.fb18.de/gfx/25.gif[/img]
char a;
Scheiss Forum [img]
http://www.fb18.de/gfx/20.gif[/img]
Das ist ein Array mit 1000000 Elementen, also char a[ 1000000 ]
Aber mit Freds Beispiel bekommen wir was anderes heraus.
Wie lautet der Befehl in Eurem Programm, mit dem Ihr immer ein Byte aus dem Array ladet?
Bist Du sicher, dass dein Programm richtig ist, Fred? :)
Ich habs von Rosenlecher absegnen lassen, das will schon was heissen [img]
http://www.fb18.de/gfx/17.gif[/img]
Bist Du sicher, dass dein Programm richtig ist, Fred? :)
Ich hab das gleiche raus wie Fred.
Ja, das Forum hat unser Array abgeschnitten :-)
Der Rest unser Funktion siet folgendermassen aus:
EditTri: Auch wenn leicht zu finden bitte (noch) keine Kompletten Codelösungen [img]
http://www.fb18.de/gfx/25.gif[/img]
AAaaah, wir haben 2 mal unsigned vergessen (wo da wohl der unterschied ist [img]
http://www.fb18.de/gfx/12.gif[/img])
Jedenfalls laeufts nun :)
bei signed füllt der beim load-befehl bis zum integer (also die oberen 24 bit) mit einsen auf, wenn das byte "negativ" war, also das oberste bit vom byte = 1 war…
z.B. ein array der laenge 100 mit je einem 'b' gefuellt ergibt bei mir ap=0x8e012649 oder auch -1912527287
Hab diesbezüglich noch eine eMail erhalten, meine Antwort interessiert vielleicht auch andere:
> wie kann eine negative Zahl als AP rauskommen.
Es kommt keine negative Zahl raus [img]
http://www.fb18.de/gfx/25.gif[/img]
Was rauskommt ist eine Zahl zwischen 0 und 2^32… und wenn das oberste Bit gesetzt ist und man die Zahl negativ INTERPRETIERT (und genau das tut %i bei printf), dann wird sie natürlich auch negativ ausgegeben.
Noch ein Beispiel:
printf("Nanu: %i\n", 4294967295);
Da kommt nicht (wie vielleicht zunächst erwartet) 4294967295 raus sondern -1.
weshalb man %u oder %x nehmen sollte… ;)
weshalb man %u oder %x nehmen sollte… ;)
Ja… wobei es im Grunde genommen aber egal ist. Wir wissen, dass die Adler32 Funktion eine 32 Bit Zahl berechnet, und diese wird zur Fehlererkennung genutzt (indem die gespeicherte mit der berechneten verglichen wird). Die Darstellung der Zahl ist daher bedeutungslos. 0xFFFFFFFF und -1 und 4294967295 sind eben alle gleich.
Hallo
Ich habe da ein Problem. Ich hab mir die RFC1950 durchgelesen. Man braucht ja offensichtlich zur Implementierung Modulodivisionen. Einen Modulo Befehl kennt die SPARC ja nicht. Kann mir jemand mal einen Tip geben, wie ich Modlo in SARC implementiere
Dankeschön
was ja auf jedenfall geht ist das ganze in c schreiben und sich das ergebnis in asm angucken indem man mit dem -S parameter compiliert
Ich habe da ein Problem. Ich hab mir die RFC1950 durchgelesen. Man braucht ja offensichtlich zur Implementierung Modulodivisionen. Einen Modulo Befehl kennt die SPARC ja nicht. Kann mir jemand mal einen Tip geben, wie ich Modlo in SARC implementiere
Du kannst ja zumindest multiplizieren und Dividieren. Wenn du nun zwei Zahlen a und b hast und willst den Rest von a geteilt durch b kriegen, wie würdest du das mit den Grundrechenarten (sagen wir ruhig mal mit so einem 2,50 Euro Taschenrechner) machen? (Genauso machts der Suncompiler nämlich)
Bei einem 1.000.000 Byte grossen Array mit a = i & 0xFF erhalte ich 0e27d8d8 als Prüfsumme.
Wenn ich das selbe Ergebnis habe, liege ich damit nun falsch oder richtig?
Bei einem 1.000.000 Byte grossen Array mit a = i & 0xFF erhalte ich 0e27d8d8 als Prüfsumme.
Wenn ich das selbe Ergebnis habe, liege ich damit nun falsch oder richtig?
Das Ergebnis ist richtig. Das heisst natürlich nicht, dass der Algorithmus korrekt ist, aber es ist schon ziemlich wahrscheinlich.
Im RFC1950 ist die adlerfunktion fogendermaßen spezifiziert:
ulong adler32 (ulong old, nchar *buf, int len)
Wir sollen sie unsigned adler(char *buf, in len) implementieren.
Da fehlt ja der alte adlerwert als parameter. Sollen wir den trotzdem inern verarbeiten, also alles in assembler, auch die umgebende schleife die dn buffer durchgeht, oder sollen wir den aus der Berechnung weglassen, also s1 immer 1 am Anfang?
Im RFC1950 ist die adlerfunktion fogendermaßen spezifiziert:
ulong adler32 (ulong old, nchar *buf, int len)
[img]
http://www.fb18.de/gfx/5.gif[/img]
Also in dem Dokument, in welchem ich nachgeschaut habe, steht:
unsigned long adler32(unsigned char *buf, int len)
Wir sollen also eigentlich die update_adler32 implementieren, oder?
Wir sollen also eigentlich die update_adler32 implementieren, oder?
So, hab jetzt noch mal ein bischen gelesen. Die Zweiteilung update_adler32 und adler32 ist nur dann notwendig, wenn Du eine Datei häppchenweise einliest und diese Happen einzeln verarbeitest. Das ist ja in der Aufgabenstellung gar nicht gefordert. Es ist ein Array gegeben, über welches die Prüfsumme errechnet werden soll.
Wenn es Dich glücklich macht, implementiere die update_adler32 und rufe sie dann so auf:
unsigned long adler32(unsigned char *buf, int len)
{
return update_adler32(1L, buf, len);
}
Aber ich sehe da ehrlich gesagt keinen Vorteil gegenüber einer Lösung, die s1 auf 1 und s2 auf 0 initialisiert.
Wenn du die main.c mal posten würdest, wäre das sehr hilfreich
[img]
http://www.fb18.de/gfx/24.gif[/img] Ansonsten können wir nur die COmpiler-Meldungen
wiederholen.
georg komm mal icq, das is einfacher ;)
#include <stdio.h>
unsigned adler32(char a[], int n)
void main()
{
char temp[ 100];
for (int i = 0; i < 100; i++)
{
temp = 'b';
}
printf("100 b's (-1912527287)\n");
printf("%d", adler32(temp, 100));
}
#include <stdio.h>
unsigned adler32(char a[], int n)
^^^^
Hier fehlt ein ``;''
wenn ihr grad am "entfehlern" seid:
das ist mein Problem:
rzdspc3$ cc main.c adler32.s
main.c:
"main.c", line 1: warning: invalid white space character in directive
adler32.s:
Undefined first referenced
symbol in file
adler32 main.o
ld: fatal: Symbol referencing errors. No output written to a.out
Also der erste Fehler scheint darin zu bestehen, dass
im "#include" irgendwo ein Leerzeichen steckt. Beim zweiten
Fehler würde ich darauf tippen, dass du irgendeinen
Funktionsnamen falsch geschrieben hast. Für weitere
Informationen bräuchte ich wieder die (oft zitierte)
Kristallkugel (oder den Quellcode [img]
http://www.fb18.de/gfx/24.gif[/img]).
"main.c", line 1: warning: invalid white space character in directive
Mal mit dos2unix die Zeilenumbrüche konvertiert?
Obwohl der cc die eigentlich schlucken müsste… benutzt Du einen anderen Compiler?
adler32.s:
Undefined first referenced
symbol in file
adler32 main.o
ld: fatal: Symbol referencing errors. No output written to a.out
wie erstellst du die .s dateien?
wenn du die unter Windows erstellst, achte darauf dass du sie in ANSI und ned in UNICODE Format speicherst.
dann müsste das eigentlich gehn.