Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hex <--> Binär- / Dualzahl ??? (https://www.delphipraxis.net/66608-hex-binaer-dualzahl.html)

Qnkel 1. Apr 2006 10:20


Hex <--> Binär- / Dualzahl ???
 
Hallo.

:duck: Ich weiß solche Fragen warn hier schon oft, ich hab au die Suche redlich bemüht, kam aber auf keinen grünen Zweig.

Ich suche 2 ganz einfache Funktionen, die mir Hex in eine 8stellige Dualzahl umrechnen und umgekehrt!

Ne einfache Funktion wo ich Hex(03) reinwerfe und Dual(00000011) rausbekomme und umgekehrt, also Dual(00000011) rein und Hex(03) raus.

Brauche das für ZLPortIO.

Vielen Dank für die Hilfe im Voraus.

Sharky 1. Apr 2006 10:24

Re: Hex <--> Binär- / Dualzahl ???
 
Hai Qnkel,

schaue Dir doch mal Delphi-Referenz durchsuchenHexToBin() und Delphi-Referenz durchsuchenBinToHex aus der Unit Classes an ;-)

Qnkel 1. Apr 2006 10:26

Re: Hex <--> Binär- / Dualzahl ???
 
Zitat:

Zitat von Sharky
Hai Qnkel,

schaue Dir doch mal Delphi-Referenz durchsuchenHexToBin() und Delphi-Referenz durchsuchenBinToHex aus der Unit Classes an ;-)

Hab ich schon. Bei HexToBin kommmt aus '03' ';B' und son kram raus und sonst stürzt da iwie mein Programm total ab jedesmal... ich bin echt zu doof anscheinend...

Alloc 1. Apr 2006 10:35

Re: Hex <--> Binär- / Dualzahl ???
 
Hi, hier mal meine eigenen kleinen Routinen für Hex->Long, Byte->Bin, Bin->Byte. Sry wegen der Schreibweise, ist noch älterer Code von mir, wo ich bissl anderen Stil hatte ;)

Hex->Bin: IntToBin(HexToLong(hex));
Bin->Hex: IntToHex(BinToInt(bin),Hex-Stellenanzahl);

Delphi-Quellcode:
FUNCTION HexToLong(hex:String):LongWord;
  FUNCTION NormalizeHexString(VAR hex:String):Boolean;
    VAR
      i:Byte;
    BEGIN
      IF hex[1]='$' THEN BEGIN
        FOR i:=1 TO Length(hex)-1 DO BEGIN
          hex[i]:=hex[i+1];
        END;
        SetLength(hex, Length(hex)-1);
      END;
      IF (hex[1]='0') AND (UpCase(hex[2])='X') THEN BEGIN
        FOR i:=1 TO Length(hex)-2 DO BEGIN
          hex[i]:=hex[i+2];
        END;
        SetLength(hex, Length(hex)-2);
      END;
      IF Length(hex)=0 THEN
        Result:=False
      ELSE
        Result:=True;
    END;
  VAR
    i:Byte;
  BEGIN
    IF NormalizeHexString(hex) THEN BEGIN
      hex:=UpperCase(hex);
      Result:=0;
      FOR i:=1 TO Length(hex) DO BEGIN
        Result:=Result SHL 4;
        CASE hex[i] OF
          '0'..'9': Result:=Result+Ord(hex[i])-48;
          'A'..'F': Result:=Result+Ord(hex[i])-55;
        ELSE
          Result:=0;
          Exit;
        END;
      END;
    END ELSE BEGIN
      Result:=0;
    END;
  END;

FUNCTION BinToInt(bin:String):Byte;
  VAR
    Add: Integer;
    i: Byte;
  BEGIN
    Result:=0;
    IF Length(bin)<>8 THEN Exit;
    Add:=1;
    FOR i:=8 DOWNTO 1 DO BEGIN
      IF NOT (bin[i] IN ['0','1']) THEN Exit;
      IF bin[i] = '1' THEN Inc(Result,Add);
      Add:=Add SHL 1;
    END;
  END;

FUNCTION IntToBin(value:Byte):String;
  VAR
    i:Byte;
  BEGIN
    SetLength(Result,8);
    FOR i:=7 DOWNTO 0 DO BEGIN
      Result[i+1]:=Char((value AND $01)+48);
      value:=value SHR 1;
    END;
  END;
mfG, Chris

Qnkel 1. Apr 2006 10:41

Re: Hex <--> Binär- / Dualzahl ???
 
Vielen Dank!

Aber trotzdem möchte ich hier mal HexToBin etc klärn

Hab das hier ma geschrieben zum basteln:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  a := '3f';
  HexToBin(PChar(a), b, Sizeof(b));
  ShowMessage(b);
end;
wenn ich a auf '3' setze, is die Ausgabe leer, wenn ichs auf '3f' setze verabschiedet sich das Programm total mmit Zugriffsverletzung etc...

ste_ett 1. Apr 2006 10:45

Re: Hex <--> Binär- / Dualzahl ???
 
Kleines Beispiel. :)

Delphi-Quellcode:
function ConvertHex2Dec(const Source: String; var Dest: String): Integer;
var
  Buffer: PChar;
  Len: Integer;
begin
  Len := (Length(Source) div 2) +1;
  GetMem(Buffer, Len);
  ZeroMemory(Buffer, Len);
  try
    Result := HexToBin(PChar(LowerCase(Source)), Buffer, Len);
    Dest := Buffer;
  finally
    FreeMem(Buffer);
  end;
end;

Qnkel 1. Apr 2006 10:54

Re: Hex <--> Binär- / Dualzahl ???
 
Delphi-Quellcode:
function ConvertHex2Dec(const Source: String; var Dest: String): Integer;
var
  Buffer: PChar;
  Len: Integer;
begin
  Len := (Length(Source) div 2) +1;
  GetMem(Buffer, Len);
  ZeroMemory(Buffer, Len);
  Result := HexToBin(PChar(LowerCase(Source)), Buffer, Len);
  Dest := Buffer;
  FreeMem(Buffer);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ConvertHex2Dec('3f', a);
  ShowMessage(a);
end;
Ganz nett. a is jetz '?' oder bei 'f3' nen griechischer Buchstabe. Das hatte ich noch nicht :-D

Oh man spinnt mein Delphi oder was... werd noch wahnsinnig :wall:

ste_ett 1. Apr 2006 11:02

Re: Hex <--> Binär- / Dualzahl ???
 
3f ist die 63 und das ist die ascii-Nummer für das Fragezeichen. :)

Versuch mal
48616C6C6F

Hawkeye219 1. Apr 2006 11:11

Re: Hex <--> Binär- / Dualzahl ???
 
Hallo Qnkel,

die folgenden Routinen erwarten/liefern den Hex-Wert in einem Byte und die Dualzahl in einem String:

Delphi-Quellcode:
function ByteToDual (aValue: Byte): string;
var i: integer;
begin
  SetLength (Result, 8);
  for i := 0 to 7 do
    Result[8 - i] := Char(48 + ((aValue shr i) and 1));
end;

function DualToByte (const aValue: string): Byte;
var i: integer;
begin
  Result := 0;
  for i := 1 to Length(aValue) do
    Result := 2 * Result + Ord(aValue[i] = '1');
end;
Aufruf z.B. mit:

Delphi-Quellcode:
s := ByteToDual($03);
b := DualToByte('00010011');
Gruß Hawkeye

Qnkel 1. Apr 2006 12:21

Re: Hex <--> Binär- / Dualzahl ???
 
Super Hawkeye, genau das brauche ich. Perfekt für ZLPortIO.

Danke an die Erklärung mit dem ASCII-Zeichen ;) Logisch. Aber das ASCII brauch ich ja net *Gg*


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz