corpsman hat geschrieben:@mse
Also die Shortstring Variante geht nun.
Statt "s: String[10 + 3 * 16];" würde mir eigentlich " s: array[0..buffersize-1] of char;" noch besser gefallen.
Weiter im Text.
Code: Alles auswählen
s[10 + j * 3] := ToHex[(B Shr 4) And $F];
s[10 + j * 3 + 1] := ToHex[B And $F];
Hier wird ziemlich viel gerechnet um die nibbles zu extrahieren. Man könnte nun eine grössere Tabelle für alle 256 Möglichkeiten pro Byte benützen:
Code: Alles auswählen
const
hextable: array[byte] of array[0..1] of char =
(
('0','0'),('0','1'),('0','2'),('0','3'),('0','4'),('0','5'),('0','6'),('0','7'),
('0','8'),('0','9'),('0','A'),('0','B'),('0','C'),('0','D'),('0','E'),('0','F'),
('1','0'),('1','1'),('1','2'),('1','3'),('1','4'),('1','5'),('1','6'),('1','7'),
('1','8'),('1','9'),('1','A'),('1','B'),('1','C'),('1','D'),('1','E'),('1','F'),
...
var
textpo: pchar;
...
textpo:= @s[10]; //für array[0..buffersize-1] of char
For j := 0 To 15 Do Begin
pword(textpo)^:= word(hextable[datapo[j]]);
//die zwei zeichen auf einen rutsch, das geht nicht mit allen prozessoren
//da das ziel auch auf ungeraden adressen liegt
inc(textpo,3);
End;
inc(datapo,16);
Eine ähnliche Methode liesse sich auch zur Erzeugung der Adressen verwenden. Bezüglich Aufbau der Schlaufe und der Datenadressierung sind auch noch andere Versionen denkbar, da müssten wir zuerst studieren, was der Compiler daraus macht.