Für die Übergabe von Strings in Hex-Darstellung genügt es, wenn man die Bereichsüberprüfung bei der Val-Funktion abschaltet:
Delphi-Quellcode:
{$R-}
Val(S, Result, E);
{$R+}
Bei Strings in Dezimaldarstellung klappt das aber nicht. Hier muss eine eigene Val her:
Delphi-Quellcode:
function ValUInt64(const s: AnsiString; var code: Integer): UInt64;
var
i,l: Integer;
dig: Integer;
empty: Boolean;
begin
l := Length(s);
i := 1;
dig := 0;
Result := 0;
if s = '' then
begin
code := i;
exit;
end;
while s[i] = ' ' do
Inc(i);
if s[i] = '+' then
Inc(i);
empty := True;
if (s[i] = '$') or (Upcase(s[i]) = 'X')
or ((s[i] = '0') and (Upcase(s[i+1]) = 'X')) then
begin
if s[i] = '0' then
Inc(i);
Inc(i);
while True do
begin
case s[i] of
'0'..'9': dig := Ord(s[i]) - Ord('0');
'A'..'F': dig := Ord(s[i]) - (Ord('A') - 10);
'a'..'f': dig := Ord(s[i]) - (Ord('a') - 10);
else
break;
end;
{$R-}
Result := Result shl 4 + dig;
{$R+}
if (l<i+1) then break;
Inc(i);
empty := False;
end;
end
else
begin
while True do
begin
case s[i] of
'0'..'9': dig := Ord(s[i]) - Ord('0');
else
break;
end;
{$R-}
Result := Result*10 + dig;
{$R+}
if (l<i+1) then break;
Inc(i);
empty := False;
end;
end;
if (s[i] <> #0) or empty then
code := i
else
code := 0;
end;
Man beachte, dass es auch hier nötig ist, die Bereichsprüfung für das Aufsummieren des Results abzuschalten.
Mir düngt so langsam, dass intern UInt64=Int64 ist.