Hallo Julian,
ich hab dir mal eine Funktion zusammengetippt, die numerische Strings von einer Basis in eine andere Basis umwandelt.
Vielleicht hilft dir das bei deinen Überlegungen.
FUNCTION BaseToBase(const source:string; sourcebase,destbase:integer):string;
.
source : Der String der die umzuwandelnde Zahl enthält.
sourcebase : Basis für source.
destbase : Basis für das Resultat.
result : Ergebnis der Umwandlung.
sourcebase und destbase können Werte von 2 bis 62 haben.
Die Ziffern werden
für 0 bis 9 durch '0'..'9'
für 10 bis 35 durch 'A'..'Z'
für 36 bis 61 durch 'a'..'z'
dargestellt.
Wenn du zum Beispiel Dezimal '100' in Hex umwandeln willst, dann rufst du die Funktion so auf
ergebnis:=BaseToBase('100',10,16);
Nehmen wir folgende Situation an
Edit1 : Die umzuwandelnde Zahl (source)
Edit2 : Das Ergebnis
Edit3 : Die Basis für die umzuwandelnde Zahl (sourcebase)
Edit4 : Die Basis für das Ergebnis (destbase)
und nehmen wir weiterhin an, es sei sichergestellt, dass Edit3 und Edit4 numerische Strings enthalten, dann kannst du die Umrechnung so vornehmen:
Delphi-Quellcode:
begin
try
Edit2.Text:=BaseToBase(Edit1.Text, StrToInt(Edit3.Text), StrToInt(Edit4.Text));
except
on E:EConvert do Edit2.Text:=E.Message;
end;
end;
Delphi-Quellcode:
type EConvert=Class(
Exception);
FUNCTION BaseToBase(
const source:
string; sourcebase,destbase:integer):
string;
type
TExtDump=array[0..9]
of byte;
const
maxU64:TExtDump=($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$3E,$40);
// 2^64-1
var
i,digit,len:integer;
value,help:extended;
c:char;
begin
// Kontrolle ob source leer und sourcebase und destbase gültig sind
if source='
'
then
raise EConvert.Create('
Source is empty');
if (sourcebase<2)
or (sourcebase>62)
then
raise EConvert.Create('
Invalid source base');
if (destbase<2)
or (destbase>62)
then
raise EConvert.Create('
Invalid dest base');
// Umwandlung von source in numerischen Wert
value:=0;
for i:=1
to Length(source)
do begin
case source[i]
of
'
0'..'
9' : digit:=Ord(source[i])-Ord('
0');
'
A'..'
Z' : digit:=Ord(source[i])-Ord('
A')+10;
'
a'..'
z' : digit:=Ord(source[i])-Ord('
a')+36;
else digit:=63;
end;
if digit>=sourcebase
then
raise EConvert.Create('
Invalid char in source');
value:=value*sourcebase+digit;
if value>Extended(maxu64)
then
raise EConvert.Create('
Overflow Error');
end;
// Umwandlung des Wertes in einen Ziffernstring der Basis destbase
if value=0
then begin
result:='
0'
end else begin
SetLength(result,64);
len:=0;
while value>0
do begin
help:=Int(value/destbase);
digit:=Trunc(value-(help*destbase));
value:=help;
inc(len);
if digit<10
then result[len]:=Chr(digit
or Ord('
0'))
else if digit<36
then result[len]:=Chr(digit+Ord('
A')-10)
else result[len]:=Chr(digit+Ord('
a')-36);
end;
SetLength(result,len);
i:=1;
while i<len
do begin
c:=result[len];
result[len]:=result[i];
result[i]:=c;
inc(i);
dec(len);
end;
end;
end;
Im Anhang sind die Sourcetexte eines kleinen Zahlenumwandlers.