Folgendes ist sehr Performance lastig:
Delphi-Quellcode:
while fs.Position <= fs.Size-1 do
begin
fs.Read(b, 1);
Bei fs.Size wird jedes mal an das Ende der Datei gesprungen und anschliessend an die aktulle Stelle zurück. Die Funktion Read gibt die Anzahl der gelesenen Bytes zurück. Das ganz du ausnutzen:
Delphi-Quellcode:
while (fs.Read(b, 1)<>0) do
begin
Deine
Access-Violation liegt daran, dass du einen Char nicht so in einen PChar konvertieren kannst.
Am besten du nutzt ganz einfach StrToHex:
e:=StrToHex(Integer(b),2)
dann muss aber e als String definiert werden.