Piwo hat geschrieben:Zunächst mal wieso müssen doppelt so viele leerzeichen reingeschrieben werden als die datei groß ist?
Der Hex-String wird natürlich doppelt so lange, weil du pro Byte in der Datei zwei Hexzeichen brauchst.
Piwo hat geschrieben:Desweiteren konnte ich nicht rausfinden was der @-operator verusacht, ist es wie bei C++ eine referenz?
Genau. Der @-Operator gibt dir unter anderem den Pointer zum ersten Zeichen in einem String zurück. Er kann dir aber genauso gut den Pointer zu jeder anderen Variablen oder Funktion zurückgeben. Dann gibt es noch den ?-Operator, der dir einen Pointer zu einer Sprungmarke zurück gibt.
In meinem Code nehme ich also den Pointer zu meinem String 'result', der schon so viele Zeichen beinhaltet wie ich benötige. Dann überschreibe ich diese Zeichen nach und nach mit 'PokeS' bis der anfangs aus Leerzeichen bestehende String komplett durch die Hex-Werte ersetzt wurde.
Der Code funktioniert momentan übrigens nur, wenn du ihn ohne Unicode kompilierst. Möchtest du Uni-Code verwenden, solltest du statt '*pResult + 2' einfach '*pResult + 2 * SizeOf(Character)' schreiben, weil dann ein einziges Zeichen im String zwei Byte belegt. Und 'SizeOf(Character)' gibt dir die passende Zeichenlänge aus und passt sich an die entsprechende Compileroption an.
In deinem vorherigen Code hast du in jedem Schleifendurchlauf den String um ein Zeichen erweitert. Dieses Vorgehen ist deshalb sehr langsam, weil folgendes passiert:
Zuerst ist dein String ja leer, aber trotzdem belegt er im Speicher schon mal ein paar Bytes, ich glaube bei PB waren das 16 Bytes. Das heißt, wenn du jetzt 15 Zeichen (plus anschließendes Nullbyte) eingelesen hast, sind diese 16 Bytes belegt und es müssen weitere 16 Bytes dahinter alloziert werden, damit noch mehr Zeichen rein passen. Das kann eine Weile so gut gehen bis nach hinten kein Platz mehr frei ist, weil der zum Beispiel für irgendwelche anderen Variablen benutzt wird. Dann muss ein komplett anderer Speicherplatz gesucht werden, in den der neue längere String rein passt. Dann wird dieser alloziert, der alte String rein kopiert, das neue Zeichen hinten dran gehängt und der alte Speicherplatz wieder frei gegeben. Und genau dieser letzte Schritt ist das, was bei deiner Version so lange dauert.
Immer, wenn der String nicht mehr in seinen alten Speicherbereich passt, muss er wo anders hin kopiert werden. Und wenn das regelmäßig passiert, dann ist das rein laufzeittechnisch gesehen eine quadratische Laufzeit.
Ich denke du kannst noch mehr Geschwindigkeit rausholen, wenn du den Hex-String selbst berechnest und rein schreibst. Ich werde das gleich mal dazu basteln.