| 

.NET C# Java Javascript Exception

4
Hallo,

ich bin neu hier. Ich möchte den C-Code von WAKE (Word Auto Key Encryption)

Link: HEREWARD - a version of WAKE with 8 Tables

nach C# übersetzen und bin, weil ich von C nicht so sehr die Ahnung habe, über einige Stellen im Code gestolpert, die ich nicht übersetzen kann.

Der C-Code:

hash8(long V[], long n, long k[], long r[], long t[])
{ long m, r3, r4, r5, r6, r7, r8, r9, r10, *e, mask = 0x00ffffff;

r3 = k[0]; r4 = k[1]; r5 = k[2]; r6 = k[3];
r7 = k[4]; r8 = k[5]; r9 = k[6]; r10 = k[7];

e = V + n - 7;

for (m = 0; m < 4; m++)
{ while (V < e)
{ r3 = (r3 ^ r6) + *V++;
r3 = (r3 >> 8 & mask) ^ t[r3 & 255];

r4 = (r4 ^ r3) + *V++;
r4 = (r4 >> 8 & mask) ^ t[256 + (r4 & 255)];

r5 = (r5 ^ r4) + *V++;
r5 = (r5 >> 8 & mask) ^ t[512 + (r5 & 255)];

r6 = (r6 ^ r5) + *V++;
r6 = (r6 >> 8 & mask) ^ t[768 + (r6 & 255)];

r7 = (r7 ^ r6) + *V++;
r7 = (r7 >> 8 & mask) ^ t[1024 + (r7 & 255)];

r8 = (r8 ^ r7) + *V++;
r8 = (r8 >> 8 & mask) ^ t[1280 + (r8 & 255)];

r9 = (r9 ^ r8) + *V++;
r9 = (r9 >> 8 & mask) ^ t[1536 + (r9 & 255)];

r10 = (r10 ^ r9) + *V++;
r10 = (r10 >> 8 & mask) ^ t[1792 + (r10 & 255)];
}
V = e - 1;
}
r[0] = r3; r[1] = r4; r[2] = r5; r[3] = r6;
r[4] = r7; r[5] = r8; r[6] = r9; r[7] = r10;
}


Mein Problem:

Die Zeilen:

e = V + n - 7;

und

r3 = (r3 ^ r6) + *V++;

kann ich nicht übersetzen. Es wäre sehr nett, wenn mir dabei jemand helfen würde, da ich von C-Pointern keine Ahnung habe.

Vielen Dank schon mal jetzt!
News:
26.09.2015
Jebi 13 3
1 Antwort
1
e ist ein Zeiger auf einen long-Wert, d. h. die Stelle auf die er zeigt, wird als long interpretiert.

Wo zeigt er nun hin (e = V + n - 7;)?
Diese Zeile liest sich folgendermaßen:
e zeigt auf die Adresse von V (auf dessen erstes Element). Dann wird der Zeiger um n Stellen weitergeschoben und um 7 zurück. e zeigt damit auf den Inhalt von V[n-7]. Um es deutlich zu sagen, e ist nicht der Inhalt von V[n-7], sondern die Adresse von V[n-7]. Da es sich bei V um ein Array handelt, kannst du e als den Index von V betrachten.

Die zweite Zeile deiner Frage liest sich so:
r3 berechnet sich aus der Potenz r3 hoch r6 plus dem Inhalt von V. V zeigt dabei gerade auf das aktuelle Element des Arrays. Anschließend wird das nächste Element des Arrays V ausgewählt (mit dem ++). Arrays sind in C im Grunde auch nur Pointer - man spart sich hier den Indexer.
Ich halte es für unglücklich, zwei Aktionen in einer Zeile auszuführen und in C# wirst du es ohnehin in mehrere Zielen aufteilen müssen:
int index = 0;
for (m = 0; m < 4; m++)
{ while (V < e)
{ r3 = (r3 ^ r6) + V[index];
index++;
...


Hoffe, ich konnte es verständlich machen.
26.09.2015
jsc 289 1 7
@jsc: Vielen Dank für die sehr gute und ausführliche Beantwortung! Damit komme ich weiter. Schönes WE
Jebi 26.09.2015

Stelle deine .net-Frage jetzt!