Pointer auf?
-
Aha jetzt ist mir einiges klar, hätte noch eine Frage
void crypt(unsigned char *s) { unsigned i, j, t; unsigned char trans; init(); for(i=0,j=0;*s;*s++) { i = (i + 1) % 256; j = (j + sbox[i]) % 256; trans = sbox[i]; sbox[i] = sbox[j]; sbox[j] = trans; t = (sbox[i] + sbox[j]) % 256; *s ^= sbox[t]; } }
Was ist das?
for(i=0,j=0;*s;*s++)//Solange *s nicht auf null zeigt oder wie?Und das?
*s ^= sbox[t];//was soll dieses ^
-
for(i=0,j=0;*s;*s++)
Dereferenzierung von s findet statt. Die schleife läuft, solange *s != 0 ist. *s++ Geht einfach alle Buchstaben durch.
Das funktioniert weil alle char strings mit einer 0 terminiert werden.*s ^= sbox[t]
^= ist eine Bitoperation, es macht z.B. aus 11001 und 10011 die zahlen 1010.
Das funktioniert, weil für unterschiedliche Bits an den Operanden ein Bit geliefert wird.
Schreiben wir einmal untereinander:11001
10011
-----
1010Die 0 davor wird weggelassen.
Das wird wohl die Stelle in deiner Funktion sein, in der der Char mit dem Wert verschlüsselt wird.
-
Ach jetzt verstehe ich wie das funktionieren soll das ^ ist wohl das xor das bei der rc4 verschlüsselung benutzt werden soll.
Gut jetzt muss ich das ganze nur noch in mips assembler umschreiben und abgeben nichts leichter als das
-
*s++ macht zwar was gewünscht ist, aber die Dereferenzierung ist Schwachsinn. s++ würde auch reichen (und zwar, weil sinngemäß *(s++) passiert und das dereferenzierte Zeichen dann nicht benutzt wird).
EDIT: Am besten gleich ++s
-
LordJaxom schrieb:
EDIT: Am besten gleich ++s
meinste das ändert was? der letzte ausdruck im 'for' wird doch erst nach'm schleifendurchlauf ausgeführt.
-
Ja, "s++" erzeugt eine temporäre Variable, die hier jedoch nicht benötigt wird - dauert also etwas länger als "++s".
-
CStoll schrieb:
Ja, "s++" erzeugt eine temporäre Variable, die hier jedoch nicht benötigt wird....
...und deswegen wird auch keine erzeugt. im letzten 'for'-ausdruck wird nur hochgezählt aber sonst nix weiter damit gemacht.
-
Mir war auch klar dass das alles wegoptimiert wird, aber sollte man deshalb *s++ statt ++s schreiben, "weil das sowieso nichts macht"? Nein, ich denke nicht
Zumal die Sache anders aussehen kann wenn s ein größeres Objekt ist.
-
LordJaxom schrieb:
Mir war auch klar dass das alles wegoptimiert wird, aber sollte man deshalb *s++ statt ++s schreiben, "weil das sowieso nichts macht"? Nein, ich denke nicht
du hast natürlich recht, das '*' ist überflüssig und stört nur beim lesen des codes
-
net schrieb:
CStoll schrieb:
Ja, "s++" erzeugt eine temporäre Variable, die hier jedoch nicht benötigt wird....
...und deswegen wird auch keine erzeugt.
Afaik ist Optimierung freiwillig - d.h. der Compiler darf die temp. Variable wegoptimieren, aber er muß nicht.
-
CStoll schrieb:
der Compiler darf die temp. Variable wegoptimieren, aber er muß nicht.
so einen compiler will ich aber nicht haben
-
es wird wohl kaum n compiler geben, der das nicht wegoptimiert. und davon kann man ausgehen. ob man s++ oder ++s schreibt, ist egal. natürlich sollte man nicht *s++ schreiben, das macht einfach keinen sinn.
-
Den Code habe ich von http://www.linux-magazin.de/Artikel/ausgabe/1997/11/Krypto/krypto5.html
hassmails also nicht zu mir
Noch eine allgemeine Frage: Wieso sollte man ein char element als unsigned deklarieren ist das nicht quatsch?
-
blizzarac schrieb:
Wieso sollte man ein char element als unsigned deklarieren ist das nicht quatsch?
sollte man garnicht. ASCII ist nur 7-bittig und wird damit von signed und unsigned char abgedeckt. ob "char" nun signed oder unsigned ist, wen kuemmerts. ascii zeichen koennen allemal dargestellt werden.
-
Hätte auch mal ne Frage. Ich bin mir nicht mehr sicher aber meines Wissens zeigt ein Pointer "der auf nichts zeigt" auf NULL. Wenn nicht ist meine Frage Sinnlos und ihr könnt sie vergessen
Ein Array sind ja eigentlich mehrere pointer, somit müsste ein Arry mit 10 Elementen doch 10 mal auf NULL zeigen oder? Solange nix drinsteht, versteht sich.EDIT: Frage Nummer2:
#include <stdio.h> int main() { char c[20]; int i; for (i=0;i!='\n'&&i<=20;++i) { c[i] = getch(); putchar('*'); } }
Ich wollte mal eine Eingabe durch sterne ersetzen (ok ersetzen nicht, weil getch() zeigts ja erst gar nicht an aber ok
)
Wenn ich jetzt aber eine Eingabe mache bricht er nach 10 Zeichen ab. Bin ich blöd oder steht da 20???
Wieso nimmt er nicht 20 Zeichen?
-
Also soweit ich weiss zeigen nicht initialisierte Pointer irgentwo hin aber nicht automatisch auf NULL, was sie gefährlich macht und meistens zu Programmabbrüchen führt.
-
ein pointer ist ne adresse.
ein char[10] "zeigt" irgendwo in den speicher, wo 10 chars stehen.ein pointer zeigt also nicht auf NULL, er IST NULL.
ein pointer zeigt aber z.b. auf einen int, also IST er die adresse der stelle im speicher, wo der wert von diesem int steht.
-
Ok danke dir
(bzw euch)
Und mein "Programm" da oben? Ich blicks einfach net warum des nach 10 Eingaben abbricht
-
i!='\n' // falsch! was steht in i?
&&
i<=20 // falsch! i < 20, sonst bist du ueber der arraygrenze
-
Hm danke jetzt gehts er ziehts durch. Was mich verwirrt: \n = 13. Also da in dem Fall i = 10 ist wieso bricht es dann schon bei 10 ab und nicht erst bei 13?