Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#27

AW: Umrechnen von Zahlensystemen

  Alt 28. Aug 2011, 20:21
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.
Angehängte Dateien
Dateityp: zip Unit1.zip (208,8 KB, 2x aufgerufen)
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat