System dziesietny, szesnastkowy, binarny

abc

Napisalem sobie kiedys pare funkcji do wlasnie przechodzenia z
dziesietnego -> szesnastkowy
dziesietnego -> binarny
String -> szesnastkowy
szesnastkowy -> String

Mozliwe ze sie komus przyda, a jako ze zawsze chcialem zamiescic cos na 4p postanowilem zamiescic tego GOTOWCA w formie gotowych funkcji :]

{
 POMOCNICZE START !! - funkcja potegujaca , pisalem sam nie wiem 
czy dziala dobrze w kazdym razie byla potrzebna do systemu 
binarnego, a ze nie trzeba ladowac calego math to mysle ze sie przyda
}

function poteN(liczba:int64;do_potegi:integer=2):int64;
   begin

     case do_potegi of
       0:result:=1;
       1:result:=liczba;
      else
        PoteN:=liczba*PoteN(liczba,do_potegi-1);
    end;
  end;
// POMOCNICZE STOP !!
// BIN START !!

{Obsluguje w miare duze cyfry, mam nadzieje ze wszystko jest jasne - jako zeby funkcja obslugiwala bardzo dlugie lancuchy binarne odwazylem sie zastosowac string jako wejscie mam nadzieje ze strtoint i inttostr wszyscy znaja :P}

function bin2int(binary:string) :int64;
var I,j:integer;wynik:Int64;
begin
  wynik:=0;
  j:=0;
for i:=length(binary) downto 1 do
  begin
  wynik:=wynik+((strtoint((binary)[i])*( poten(2,j))));
  inc(j);
  end;
   result:=wynik;
end;

{Tu natomiast w druga strone integer na binary, jako wejscie mozna podac zakres int64 jako wynik string, gdyz takie lancuchy binarne sa b.dlugie :] 
}

function int2bin(int:int64):string;
var strtemp:string;
begin
while int>0 do
begin
insert(inttostr(int mod 2),strtemp,1);
int:= int div 2;
end;
result:=(strtemp);
end;

// BIN STOP !!

// START HEX !!

{
To jest w sumie uprostrzenie funkcji gotowej - nie ma co sie glowic :] 
w koncu niewazna jest metoda, wazny jest rezultat, a skoro zagladasz do gotowcow to raczej rezultat jest Ci potrzebny (no przynajmniej w 90%)
}

function int2hex(int:integer):string;
begin
result:=inttohex(int,2);
end;

{
Tu tez z wykozystaniem gotowej funkcji, chyba nie ma sporow co do tego ze dziala, a najwazniejsze jest to ze jest w miare szybka
}

function hex2int(hex:string):integer;
begin
result:=strtoint('$'+hex);
end;

{
To jest zmienienie wartosci hex na string - wiadomo ze najlepiej odwracac z funkcji str2hex, ale powinno dzialac tak jak jest w hexedytorach
}

function hex2str(hex:string):string;
var i:integer;s:string;
begin
s:='';
i:=1;
  while i<=length(hex) do
    begin
    s:=s+chr(strtoint('$'+copy(hex,i,2)));
    i:=i+2;
    end;
    result:=s;
end;

{
Funkcja str2hex - hmm mysle ze wynik taki sam jak w hexedytorach POWINIEN byc :]
}

function str2hex(str:string):string;
var i:integer;s:string;

begin
s:='';
for i:=1 to length(str) do
s:=s+inttohex(ord(str[i]),2);
result:=s;

end;
// STOP HEX !!

Jako, ze uznaje gotowce raczej cos co ma byc gotowe, a nie ze ma tlumaczyc dlaczego tak, a dlaczego nie nie zamieszczam dokladnych opisow funkcji (co sie dzieje i dlaczego tak), mam nadzieje ze jak ktos bedzie potrzebowac i skorzysta wystawi jakis komentarz mily, a tutejsi "krytycy" nie "pojada" mnie zbyt mocno :]

5 komentarzy

Poco tak komplikować? Funkcja potęgi nie jest potrzebna do realizacji konwersji.
Może wkleję rozwiązanie uniwersalne ;) czyli na dowolny system i z powrotem - bin, oct, dec, hex
a także nietypowe systemy np piątkowy czy tez 36-kowy :]

const Digits:String='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function ValToDig(Val:Byte):Char;
begin
Result:=Digits[Val+1];
end;

function IntToSys(Value:Int64;Sys:Byte):String;
begin
if Value<>0 then
begin
SetLength(Result,0);
while Value>0 do
begin
Insert(ValToDig(Value mod Sys),Result,1);
Value:=Value div Sys;
end;
end
else Result:='0';
end;

function DigToVal(Dig:Char):Byte;
var S,P:PChar;
begin
S:=@Digits[1];
P:=StrScan(S,Dig);
if P<>nil then Result:=Byte(P-S) else Result:=36;
end;

function SysToInt(const Str:String;Sys:Byte):Int64;
var I:Integer;
var D:Byte;
begin
Result:=0;
for I:=1 to Length(Str) do
begin
D:=DigToVal(Str[I]);
if D>=Sys then raise Exception.Create(Str+' is not valid '+IntToStr(Sys)+'-system number');
Result:=Result*Sys+D;
end;
end;

To cos nie chce za bardzo dzialać (mam delphi 7)

Powiedzcie, co dodać do sekcji uses... bo prawdopodobnie czepia się o to...

Dokładnie o in64... :(

mysle ze dla poczatkujacych bardziej przydatne byloby wytlumaczenie przeliczania bin / dec / hex :] Bo tak to poczatkujacy wklepia kod ktorego nie rozumieja ;) no ale jak kto woli ...

do potęgowania w Delphi jest funkcjo Pow lub w ostateczności x^y = exp(y * ln(x))

Co nie zmienia faktu , ze funkcja zwracajaca int64 tez dziala :>
a Pow nie trzeba braz z math ?

  • w delphi malo siedze juz troche sie pozapominalo :P