Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Ergänzung zu "Von beliebigem Zahlensystem in ein andere

  Alt 21. Aug 2008, 21:54
Hi,

Ich wurde gerade gefragt, wie man z.B. Zahlen aus dem Dezimalsystem ins Hexadezimalsystem konvertiert.

Darauf hat mich der Ehrgeiz gepackt und ich habe aus Eigeninteresse versucht Zahlen zwischen beliebigen Zahlensystemen hin und herzukonvertieren. Das was rauskam, war meines Erachtens einen CodeLib Beitrag Wert. Allerdings hab ich gesehn, dass glkgereon da schon was gepostet hatte.

Aber da ich mit nur 2 Funktionen auskomme und mein Code sich sonst auch mehr oder weniger stark von glkgereons Code unterscheidet, wollte ich meinen auch mal posten.

Link zum CodeLib Beitrag: *klick*

Delphi-Quellcode:
uses Math;

function BaseToDec(Value: String; Base: Byte): Int64;
var tmp: Byte;
    i: Integer;
begin
  Result := 0;
  for i:= Length(Value) downto 1 do
  begin
    tmp := Ord(Value[i]);
    if tmp in [$30..$39] then
      tmp := tmp - $30
    else
      tmp := 9 + (tmp-$40);
    Result := Result + (tmp*Round(IntPower(Base,Length(Value)-i)));
  end;
end;

function ConvertNumber(Value: String; SrcBase,DestBase: Byte): String;
var nr,old: Int64;
    tmp: Byte;
begin
  if (not (SrcBase in [2..36])) or (not (DestBase in [2..36])) then
    exit;

  nr := BaseToDec(Value,SrcBase);
  repeat
    old := nr;
    nr := old div DestBase;
    tmp := old mod DestBase;
    if tmp > 9 then
      Result := Chr($40+tmp-9) + Result
    else
      Result := IntToStr(tmp) + Result;
  until nr = 0;
end;
Das wars dann auch erstmal

Edit: Hatte doch auch was zu Phantom1s Funktion geschrieben o.O Naja dann halt noch nachträglich.
Habe die bei einer Foren Suche entdeckt und wollte sie auch mal erwähnt haben. Die Funktion wurde wie gesagt von Phantom1 gepostet. Ob Sie ursprünglich von Phantom1 stammt, weiß ich nicht:


Delphi-Quellcode:
function BaseToBase(Value: string; StartBase, EndBase: byte): string;
const Digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var i: Integer; dez, j: Int64;
begin
  Result:='';
  if (StartBase<2) or (StartBase>36) or
     (EndBase<2) or (EndBase>36) then Exit;
  for i:=1 to Length(Value) do begin
    j:=Pos(Value[i], Digits);
    if (j>StartBase) or (j=0) then Exit;
  end;
  j:=1;
  dez:=0;
  for i:=Length(Value) downto 1 do begin
    dez:=dez + (Pos(Value[i], Digits)-1) * j;
    j:=j*StartBase;
  end;
  repeat
    Result:=Digits[dez mod EndBase+1] + Result;
    dez:=dez div EndBase;
  until dez=0;
end;
Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat