Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi HexToInt (https://www.delphipraxis.net/135333-hextoint.html)

Carsten1234 9. Jun 2009 06:38


HexToInt
 
Hallo,

ich bekomme die Zeichenfolge (Werte)
FF FF FF E2
und weiß, dass daraus der Wert -30 werden soll(t)e.
Anderes Beispiel:
00 00 00 46 => +70

Frage: Wie lautet die Umrechnung?

Dank vorab und Gruß, Carsten

mleyen 9. Jun 2009 06:50

Re: HexToInt
 
Hast du schon die CodeLib-Variante getestet?

Carsten1234 9. Jun 2009 07:00

Re: HexToInt
 
Zitat:

Zitat von mleyen
Hast du schon die CodeLib-Variante getestet?

Jepp. Mir fehlt aber
HexCharToWert

Gruß, Carsten

mkinzler 9. Jun 2009 07:04

Re: HexToInt
 
Was soll HexCharToWert machen?

mleyen 9. Jun 2009 07:07

Re: HexToInt
 
Meinst du soetwas:
Delphi-Quellcode:
function HexCharToWert(const HexChar: Char): Byte;
begin
  Result := StrToInt( '$'+HexChar );
end;
:?:

mkinzler 9. Jun 2009 07:10

Re: HexToInt
 
Zusätzlich müssen dann halt noch die Leerzeichen entfernt werden

Draos 9. Jun 2009 07:13

Re: HexToInt
 
HexCharToWert ist im Codebeispiel drin. Allerdings ist HexToInt parallel dazu anzuwenden.

HexCharToWert war für einzelne Buchstaben gedacht, aber sollte HexToInt auch einzelne Buchstaben korrekt umwandeln.

Er muss Leerzeichen entfernen und ich weiß nicht recht, ob sein Code Zahlen <0 mit HexToInt erkennt?

Carsten1234 9. Jun 2009 08:02

Re: HexToInt
 
HexCharToWert steigt leider aus mit einer EConvertException, wenn ich versuchen lasse, dass ÿ (ASCII-Wert $FF, s. ASCII-Tabelle) konvertieren zu lassen.
Was funktioniert, ist ein Ord('ÿ');
Ich könnte also machen:
Delphi-Quellcode:
var b1: byte;
    b2: byte;
    b3: byte;
    b4: byte;
und dann

b1:= Ord('ÿ'); // $FF
b2:= Ord('ÿ'); // $FF
b3:= Ord('ÿ'); // $FF
b4:= Ord('ä'); // $E2

Trotzdem: Wie komme ich damit auf -30 (dezimal)?

mkinzler 9. Jun 2009 08:04

Re: HexToInt
 
ÿ ist auch kein Hexwert

Carsten1234 9. Jun 2009 08:11

Re: HexToInt
 
Zitat:

Zitat von mkinzler
ÿ ist auch kein Hexwert

Nö, aber
function HexCharToWert(const HexChar: Char): Byte;
will doch ein Char als Eingangsparameter...

mkinzler 9. Jun 2009 08:13

Re: HexToInt
 
In diesem Fall wohl 'F'

Sonst
Delphi-Quellcode:
Wert := Ord('ÿ');

Carsten1234 9. Jun 2009 08:23

Re: HexToInt
 
Alternativ:
Delphi-Quellcode:
var b1: byte;
    b2: byte;
    b3: byte;
    b4: byte;
    Value: integer;
begin
  Value:= b1* 16777216 + b2 * 65536 + b3 * 256 + b4;
end;
Dann kommt für
FF FF FF E2 auch -30 raus. :drunken:

Draos 9. Jun 2009 08:34

Re: HexToInt
 
Das er FF als -1 erkennt brauchste die Anzahl der möglichen Hexadezimalstellen.

Delphi-Quellcode:
 function pow(x,n:Integer):Integer;
 begin
  if n>1 then
   result:=x*pow(x,n-1)
  else result:=x;
 end;

var x   :Integer;
    s   :String;
begin
 s:='FF';

 x:=HexToInt(s);

 if x>pow(16,Length(s)-1) then
  x:=x-pow(16,Length(s));

end;
 //x ist der Integer-Wert
Nachteil: 15 ist nicht F sonder 0F

himitsu 9. Jun 2009 09:35

Re: HexToInt
 
ist das FF FF FF E2 jetzt die Hexdarstelung des Strings, oder sieht der String genau so aus?

Delphi-Quellcode:
S := 'FF FF FF E2';
i := StrToInt(StringReplace('$' + S, ' ', '', [rfReplaceAll]));


S := #$FF#$FF#$FF#$E2;
i := PLongInt(@S[1])^;

Draos 9. Jun 2009 13:39

Re: HexToInt
 
String mit leezeichen?
wie wärs damit?
Delphi-Quellcode:
for i:=1 to Length(S) do
 if S[i]=' ' then
  s[i]:='';

himitsu 9. Jun 2009 14:09

Re: HexToInt
 
Zitat:

Zitat von Draos
String mit leezeichen?
wie wärs damit?

geht nicht, erstmal kann ein Char nicht "leer" sein ... aber Delphi-Referenz durchsuchenDelete würde aushelfen
und dann würde bei dieser Zählrichtung schnell der Index aus dem Bereich rauswandern, da der String schließlich schrumpfen würde :angel2:

Draos 9. Jun 2009 15:25

Re: HexToInt
 
Delphi-Quellcode:
var s    :String;
    i    :Integer;
begin
 s:=edit1.Text;
 repeat
  Delete(s,pos(' ',s),1);
 until pos(' ',s)=0;
 edit2.text:=s;
also sowas eher? Danke so lernt man

himitsu 9. Jun 2009 15:33

Re: HexToInt
 
jupp, würde gehn

oder einfach die Zählrichtung umkehren
Delphi-Quellcode:
for i := Length(S) downto 1 do
  if S[i] = ' ' then
    Delete(S, i, 1);
das Problem bei for i := 1 to Length(S) do ist einfach, daß Length nur bei Schleifenbeginn einmal ausgewertet, das Ergebnis gespeichert und danach nur noch die "Kopie" verwendet wird.
außerdem würden bei 2 folgenden ' ' immer das Zweite übersprungen, da sich ja im nächsten Durchgang der Index erhöht und das 2. ' ' eines vorrutscht.

und im Notfall würde auch Delphi-Referenz durchsuchenStringReplace aushelfen :angel:

Carsten1234 10. Jun 2009 05:54

Re: HexToInt
 
Hallo zusammen,

zur Info: die von mir genannten Werte kommt als HEX im Format HiWord/LoWord rein. Es ist also kein String in dem Sinne, wo etwaige Leerzeichen gelöscht werden müssten. War jetzt vielleicht von mir etwas blöd ausgedrückt - sorry.

Gruß, Carsten

Carsten1234 10. Jun 2009 06:15

Re: HexToInt
 
Hallo zusammen,

zur Info: Die von mir genannten Werte kommen als HEX im Format HiWord/LoWord rein. Es müssen also keine etwaige Leerzeichen gelöscht werden. Im Trace-Log der von mir verwendeten Komponenten ApdCOMPort (s. AsyncPro) sieht das so aus:
[FF][FF][FF][E2]

Da jedoch die Komponente kein GetByte/GetWord kennt, sondern nur ein GetChar/GetBlock, werden die (Einzel-)Werte vor mir via GetChar abgeholt, um sie dann via Ord in Zahlen zu wandeln bzw. daraus letztendlich wieder den ursprünglichen Wert -30 zu erhalten.
Sollte ich mich da etwas unklar ausgedrückt haben, so tut es mir leid.

Gruß, Carsten

himitsu 10. Jun 2009 09:48

Re: HexToInt
 
im Prinzip:
Delphi-Quellcode:
Temp: LongInt;

Temp := Ord(GetChar);
Temp := Temp shl 8 or Ord(GetChar);
Temp := Temp shl 8 or Ord(GetChar);
Temp := Temp shl 8 or Ord(GetChar);
oder du ließt die gesamten 4 Byte via GetBlock direkt in Temp

Carsten1234 10. Jun 2009 11:00

Re: HexToInt
 
Sieht latürnich galanter aus als meines. :dp:

Zitat:

Zitat von himitsu
oder du ließt die gesamten 4 Byte via GetBlock direkt in Temp

Jein. Diese vier Werte sind Teile eines ganzen Datenstroms an Werten, wobei, um es ganz genau zu sagen, dieser gesamten Datenstrom via GetBlock in ein array of char aus- bzw. eingelesen wird. Und aus diesem array of char hole ich mir dann letztendlich (und nicht via GetChar) die benötigten Werte.

himitsu 10. Jun 2009 11:05

Re: HexToInt
 
In Bezug auf Delphi2009 (Unicode) wäre da ein Array of AnsiChar wohl besser geeignet.

Delphi-Quellcode:
var Data: Array of AnsiChar;
//oder
var Data: Array[0..x] of AnsiChar;
  i: LongInt {oder Integer};

i := PLongInt(@Data[startindex]);


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 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