Programowanie w języku Delphi » Gotowce

System dziesietny, szesnastkowy, binarny

  • 5 komentarzy
  • 2068 odsłon
  • Oceń ten tekst jako pierwszy
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

_13th_Dragon 2008-06-19 14:17

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:[email protected][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;

blade95 2008-03-29 22:40

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... :(

migajek 2005-11-17 10:15

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 ...

Misiekd 2005-11-17 12:51

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

abc 2005-11-17 19:21

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