Avatar billede pib Nybegynder
02. december 2002 - 09:44 Der er 7 kommentarer og
1 løsning

IntToHex og omvendt

Hvordan laver man sådan en procedure? Det skal være uden brug af de indbyggede funktioner. Så simpelt og enkelt som muligt og helst med kommentarer
Avatar billede morten_s Nybegynder
02. december 2002 - 11:05 #1
Det kan Delphi direkte, lidt fra hjælpefilen

Unit

SysUtils

Category

numeric formatting routines

function IntToHex(Value: Integer; Digits: Integer): string; overload;
function IntToHex(Value: Int64; Digits: Integer): string; overload;

Description

IntToHex converts a number into a string containing the number's hexadecimal (base 16) representation. Value is the number to convert. Digits indicates the minimum number of hexadecimal digits to return.
Avatar billede pib Nybegynder
02. december 2002 - 16:12 #2
Det skulle være uden brug af de indbyggede funktioner!
Avatar billede morten_s Nybegynder
02. december 2002 - 16:26 #3
Hvorfor vil du ikke bruge de indbyggede funktioner?

du har koden her i ren asambler, hurtiger og bedre kan det ikke blive

function IntToHex(Value: Integer; Digits: Integer): string;
//  FmtStr(Result, '%.*x', [Digits, Value]);
asm
        CMP    EDX, 32        // Digits < buffer length?
        JBE    @A1
        XOR    EDX, EDX
@A1:    PUSH    ESI
        MOV    ESI, ESP
        SUB    ESP, 32
        PUSH    ECX            // result ptr
        MOV    ECX, 16        // base 16    EDX = Digits = field width
        CALL    CvtInt
        MOV    EDX, ESI
        POP    EAX            // result ptr
        CALL    System.@LStrFromPCharLen
        ADD    ESP, 32
        POP    ESI
end;
Avatar billede pib Nybegynder
02. december 2002 - 16:32 #4
Jeg er ikke så avanceret - jeg har et lignende spørgsmål, det skal være på samme form som det: http://www.eksperten.dk/spm/285070
Avatar billede hreiff Nybegynder
06. december 2002 - 12:03 #5
Her er noget der laver int til hex:

Function MyIntToHex(x:Integer):String;
Const
  arr:String[16]='0123456789ABCDEF';
Var
  d,m:integer;
  temp: string;
Begin
  temp := '';
  result := '';
  If x<0 then
  begin
    x := -x;
    result := '-';
  end;
  repeat
    d := x div 16;
    m := x mod 16;
    temp := temp + arr[m+1];
    x := d;
  until d <= 0;
  for d := length(temp) downto 1 do
    result := result + temp[d];
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := MyIntToHex(StrToInt(Edit1.Text));
end;
Avatar billede hreiff Nybegynder
06. december 2002 - 12:15 #6
Eller man kan spare et par variable (her kun løkken):

  repeat
    temp := temp + arr[(x mod 16)+1];
    x := x shr 4;    {samme som x div 16}
  until x <= 0;
Avatar billede hreiff Nybegynder
06. december 2002 - 15:48 #7
Her er den den anden vej: (den er lidt klampet, men den virker. Ret selv til)

Function MyHexToInt(x:String):LongInt;
Const
  arr:String[16]='0123456789ABCDEF';
Var
  d,m:integer;
  sign : boolean;
  temp: string;

Function pow16(potens:integer): LongInt;
Begin
  result := round(Exp(potens * ln(16)));
End;

Begin
  temp := '';
  result := 0;
  If length(x) > 0 then
  begin
    If x[1] = '-' then
    begin
      sign := true;
      if length(x) = 1 then exit
      else x := copy(x,2,255);
    end
    else sign := false;
    for d := length(x) downto 1 do
      temp := temp + x[d];
    for d := 1 to length(temp) do
    begin
      m := pos(temp[d],arr)-1;;
      if m = -1 then exit;
      result := result+m*pow16(d-1);
    end;
    if sign then result := - result;
  end;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := IntToStr(MyHexToInt(Edit1.Text));
end;
Avatar billede hreiff Nybegynder
06. december 2002 - 15:58 #8
Funktionen kunne også være: (lidt mere elegant)

Function pow16(potens:integer): Longint;
Begin
  result := 1 shl (4*potens);
End;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Kryptokustode til opbygning af Forsvarets nye IT-platform

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Vil du være med til at opbygge og udvikle Forsvarets dronekapacitet?

Netcompany A/S

Linux Operations Engineer

Rambøll Management Consulting

Senior AI Engineer