Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Int zu Hex wandeln (https://www.delphipraxis.net/46574-int-zu-hex-wandeln.html)

Matczek 27. Mai 2005 14:42


Int zu Hex wandeln
 
Hallo Leute,
ich habe da ein kleines Problem und ich stehe ein bischen auf'm Schlau.

Ich habe einen Integerwert (z.B. 1000) und benötige ihn in HEX also "0003E8". Das kann man ja mit IntToHex prima machen.

Das ist aber nicht ganz das was ich benötige. Ich benötige nämlich
str = Char($00)+Char($03)+Char($E8).

Gibt es ein einfache Möglichkeit das ganze zu bewerkstelligen?

Gruß Matthias

PS: Delphi 5 habe ich

JasonDX 27. Mai 2005 14:51

Re: Int zu Hex wandeln
 
du brauchst es dann gar nicht zu konvertieren, sondern einfach den binären aufbau eines Integers nutzen ;)

also sowas:
Delphi-Quellcode:
function ToStr(Zahl: integer): string;
begin
  result := char((Zahl shr 16) and $FF) + char((Zahl shr 8) and $FF) + char(Zahl and $FF);
end;
Ich bin mir nicht sicher, obs das 'and $FF' überhaupt braucht, und ich gebe auch keine Garantie, dass das Funktioniert, aber es dürfte in die Richtung von dem gehn, was du brauchst ;)

Luckie 27. Mai 2005 14:53

Re: Int zu Hex wandeln
 
Oder man benutzt gleich Delphi-Referenz durchsuchenIntToHex
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  i: Integer;
begin
  Label1.Caption := '';
  for i := 1 to Length(Edit1.Text) do
  begin
    try
      Label1.Caption := Label1.Caption + IntToHex(Edit1.Text[i],2) + ' ';
    except
      Beep;
    end;
  end;
end;

UweR 27. Mai 2005 15:13

Re: Int zu Hex wandeln
 
Hallo Matthias,

da muß ich auch mal Fragen wofür du das brauchst?

Du kannst dir das einfach über einen varianten Recordteil holen. Also so:

Delphi-Quellcode:
type
   TIntChar = record
      case integer of
         0 : ( WholeNumber : Int );
         1 : (SingleBytes : array[0..3] of char);
   end;

var
   IntChar : TIntChar;
   c : char;

begin
   IntChar.Wholenumber := 1000;
   c := IntChar.SingleBytes[0];
Allerdings muß du auf die little und big Endians aufpassen. Die 1000 steht quasi verkehrt rum im Speicher. Also als E8030000.

Kroko1999 27. Mai 2005 15:45

Re: Int zu Hex wandeln
 
Da lief mir doch etwas über den Weg:
siehe hier :evil:

JasonDX 27. Mai 2005 15:50

Re: Int zu Hex wandeln
 
Ich schätze mal, es ist nich verboten, in anderen Foren die selbe Frage zu posten
Vielleicht bekommt er da ne andere, besser oder sonstwie vorzuziehende Lösung, die er uns hier dann vorstellen kann ;)

Matczek 27. Mai 2005 15:57

Re: Int zu Hex wandeln
 
wow das geht aber fix hier mit den antworten!

@UweR
Kurz gesagt: Ich habe hier ein Gerät welches in HEX kommuniziert und ich muss es mit einer DeviceID ansprechen. Könntest du den Source noch ein bischen erklären? Ich verstehe das mit dem "case integer of" nicht ganz, wieso funktioniert das?

Wie kommt man auf sowas? Kennt ihr zufällig ein gutes Tutorial welches auch solche Kniffe beinhaltet?

@Chimaira und Kroko1999
also vorstellen brauch ich das je jetzt nicht mehr ihr habt ja jetzt den Link. Danke dir Kroko1999. :)

mit Dank und Gruß
matthias

Waldteufel 27. Mai 2005 16:19

Re: Int zu Hex wandeln
 
Hi.

@Luckie: Wenn er den Hex-Wert $60708090 hat, will er den String '<FPZ' (#$60#$70#$80#$90)... IntToHex($60708090) gibt aber '60708090' zurück... ;-)

So gehts auch (ein ähnlich schmutziger Trick wie bei UweR... ;-) ):
Delphi-Quellcode:
function ReverseInt(i : integer) : integer; // ungetestet
begin
  result := ((i and $000000FF) shl 24) or ((i and $0000FF00) shl 8) or ((i and $00FF0000) shr 8) or ((i and $FF000000) shr 24);
end;

function DasWasMatczekWill(i : integer) : ShortString;
var
  p : Pointer;
begin
  result[0] := #4;
  p := @result[1];
  p^ := ReverseInt(i);
end;
@Matczek: Das case of integer heißt, dass der Record - abhängig von einem Feld - seinen Aufbau wechselt, seinen Inhalt jedoch nicht.
Aber warum sendest du nicht direkt den Integer? :gruebel: Der String enthält ja noch Zusatzinfos (Länge, Referenzzähler oder #0 am Ende)

//edit: Ganz klein und ganz hell...

marabu 27. Mai 2005 16:35

Re: Int zu Hex wandeln
 
Und das hier geht auch noch:

Delphi-Quellcode:
type
  TCharArray = array of char;

function Pack(hex: string): TCharArray;
begin
  SetLength(Result, Length(hex) shr 1);
  HexToBin(@hex[1], @Result[0], Length(Result));
end;
Grüße vom marabu

UweR 27. Mai 2005 18:28

Re: Int zu Hex wandeln
 
@Waldteufel:
Zitat:

So gehts auch (ein ähnlich schmutziger Trick wie bei UweR... ):
Was heißt hier schmutziger Trick. Wenn's so dirty wäre wäre das Feature wohl nicht implementiert :zwinker:. Außerdem erzähle das bloß keinem C-Programmierer. Da nennt sich sowas union und gehört zum Handwerkszeug.

Das was du da veranstaltest fällt schon eher in die Kategorie "Dirty Trick", vor allem wenn man das Short bei ShortString vergißt und sich über die Ergebnisse wundert. Dann schon lieber sauber zwei Zeiger aufgesetzt! Das kapiert auch jemand dem der Aufbau eines ShortString nicht unbedingt vertraut ist.

@Matczek
Zitat:

Ich habe hier ein Gerät welches in HEX kommuniziert und ich muss es mit einer DeviceID ansprechen.
Sowas hatte ich mir schon gedacht. Die Antwort wie's funktioniert haben dir die Kollegen ja schon gegeben, es ist einfach der selbe Speicherwert und er wird nur anders interpretiert und es gibt auch viele Wege die nach Rom führen wie wohl schon bemerkt hast. Such dir den aus der dir am besten gefällt.

Tja wo hat man sowas her? Bei mir muß ich sagen das sich solche Schweinereien noch aus meiner C-Zeit kenne und einfach in Delphi nach dem Gegenstück gesucht habe. Tut kenn ich keines, das eignet man sich halt im Laufe der Jahre so an wie man's brauch!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr.
Seite 1 von 2  1 2      

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