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 |
Re: HexToInt
Hast du schon die CodeLib-Variante getestet?
|
Re: HexToInt
Zitat:
HexCharToWert Gruß, Carsten |
Re: HexToInt
Was soll HexCharToWert machen?
|
Re: HexToInt
Meinst du soetwas:
Delphi-Quellcode:
:?:
function HexCharToWert(const HexChar: Char): Byte;
begin Result := StrToInt( '$'+HexChar ); end; |
Re: HexToInt
Zusätzlich müssen dann halt noch die Leerzeichen entfernt werden
|
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? |
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:
und dann
var b1: byte;
b2: byte; b3: byte; b4: byte; b1:= Ord('ÿ'); // $FF b2:= Ord('ÿ'); // $FF b3:= Ord('ÿ'); // $FF b4:= Ord('ä'); // $E2 Trotzdem: Wie komme ich damit auf -30 (dezimal)? |
Re: HexToInt
ÿ ist auch kein Hexwert
|
Re: HexToInt
Zitat:
function HexCharToWert(const HexChar: Char): Byte; will doch ein Char als Eingangsparameter... |
Re: HexToInt
In diesem Fall wohl 'F'
Sonst
Delphi-Quellcode:
Wert := Ord('ÿ');
|
Re: HexToInt
Alternativ:
Delphi-Quellcode:
Dann kommt für
var b1: byte;
b2: byte; b3: byte; b4: byte; Value: integer; begin Value:= b1* 16777216 + b2 * 65536 + b3 * 256 + b4; end; FF FF FF E2 auch -30 raus. :drunken: |
Re: HexToInt
Das er FF als -1 erkennt brauchste die Anzahl der möglichen Hexadezimalstellen.
Delphi-Quellcode:
Nachteil: 15 ist nicht F sonder 0F
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 |
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])^; |
Re: HexToInt
String mit leezeichen?
wie wärs damit?
Delphi-Quellcode:
for i:=1 to Length(S) do
if S[i]=' ' then s[i]:=''; |
Re: HexToInt
Zitat:
und dann würde bei dieser Zählrichtung schnell der Index aus dem Bereich rauswandern, da der String schließlich schrumpfen würde :angel2: |
Re: HexToInt
Delphi-Quellcode:
also sowas eher? Danke so lernt man
var s :String;
i :Integer; begin s:=edit1.Text; repeat Delete(s,pos(' ',s),1); until pos(' ',s)=0; edit2.text:=s; |
Re: HexToInt
jupp, würde gehn
oder einfach die Zählrichtung umkehren
Delphi-Quellcode:
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.
for i := Length(S) downto 1 do
if S[i] = ' ' then Delete(S, i, 1); 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 StringReplace aushelfen :angel: |
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 |
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 |
Re: HexToInt
im Prinzip:
Delphi-Quellcode:
oder du ließt die gesamten 4 Byte via GetBlock direkt in Temp
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); |
Re: HexToInt
Sieht latürnich galanter aus als meines. :dp:
Zitat:
|
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