AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Negative HEX-Werte übertragen

Offene Frage von "Carsten1234"
Ein Thema von Carsten1234 · begonnen am 12. Mär 2009 · letzter Beitrag vom 12. Mär 2009
Antwort Antwort
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#1

Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 09:43
Hallo zusammen,

irgendwie wollen die grauen Zellen nicht (mehr) so recht.

Via ApdCOMPort sollen Hex-Daten im Format Hi/Lo übertragen werden. Um dies zu realisieren, wird eine Zahl via HiWord/LoWord zerlegt und mittels Chr und ApdCOMPort.PutString abgeschickt.
Delphi-Quellcode:
var Zahl: SmallInt;
begin
  ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl));
end;
Funktioniert auch wunderprächtig, so lange die Zahl > -1 ist. Um dies zu beheben, setzte ich bewusst einen Breichsüberlauf ein, das ganze sieht dann so aus:
Delphi-Quellcode:
var Zahl: SmallInt;
begin
  if (Zahl < 0) then
    Zahl:= Zahl + $FFFFFFFFFFFFFFFF + 1;
  ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl));
end;
Das funktioniert nun auch mit negativen Zahlen, ABER:
Das geht nur gut, so lange die Zahl -256 nicht unterschreitet.
Daher dachte ich mir:
Delphi-Quellcode:
var Zahl: SmallInt;
begin
  if (Zahl < 0) then
    Zahl:= Zahl + $FFFFFFFFFFFFFFFF + 1 + (((Abs(Min)-1) div 256) * 256);
  ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl));
end;
Aber weder ein '+' noch ein '-' hinter der 1 bringt das gewünschte Ergebnis.
Sowohl bei einem '+' als auch bei einem '-' kommt (z.B.) bei einer -300 eine -44 im Gerät an.

Wo ist der Denkfehler?

Dank vorab und Gruß, Carsten

Mist, falsches Unterforum. Kann man den Beitrag irgendwie verschieben?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

Re: Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 09:53
blos mal 'ne Frage...

SmallInt = 2 Byte

$FFFFFFFFFFFFFFFF+1 = 8 Byte (Int64)

auf 'nen Int64 macht diese Rechnung garnichts, da das zuaddierte Bit an 64.-ter Stelle nicht in Int64 reinpaßt ... aus SmallInt isses schon lange raus ....
praktisch gesehn passier da nix.

und du solltest schauen wo der Fehler liegt ... mit solchen Rechnungen verschiebst du nur das Problem an eine andere Stelle, aber es ist immernoch da!
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#3

Re: Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 10:26
Zitat von himitsu:
und du solltest schauen wo der Fehler liegt ... mit solchen Rechnungen verschiebst du nur das Problem an eine andere Stelle, aber es ist immernoch da!
Ich sag ja nicht, dass meine Lösung der Weisheit letzter Schluss ist. Für alternative Lösungen bin ich frei.
Wenn ich im Gerät händisch einen Wert von -300 eingebe und diesen Wert via Prg. auslese, erhalte ich im Hi/Lo-Format die
Werte
Dez.: 254; 212
Hex : FE D4

Ein
Delphi-Quellcode:
function HexToInt(HexNum: string): LongInt;
begin
  Result:=StrToInt('$' + HexNum);
end;
mit
value:= HexToInt('FED4');
liefert brav -300.

Das Pendant IntToHex() liefert bei -300 FFFFFFED4 und das ist irgendwie doof.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 10:33
Zitat von Carsten1234:
Ein
Delphi-Quellcode:
function HexToInt(HexNum: string): LongInt;
begin
  Result:=StrToInt('$' + HexNum);
end;
mit
value:= HexToInt('FED4');
liefert brav -300.

Das Pendant IntToHex() liefert bei -300 FFFFFFED4 und das ist irgendwie doof.
Einfach die ersten vier Stellen abschneiden, dann machst du aus dem int einen Smallint. Beachte jedoch den Wertebereich/eventuelle Über/Unterläufe.
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#5

Re: Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 12:01
Zitat von jfheins:
Einfach die ersten vier Stellen abschneiden, dann machst du aus dem int einen Smallint. Beachte jedoch den Wertebereich/eventuelle Über/Unterläufe.
Mache ich jetzt auch einfach und caste vorher auf Smallint.

Gruß, Carsten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#6

Re: Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 12:07
Entweder von StrToInt(Integer) nach SmallInt casten


oder eventuell +32768 rechnen, also das Ganze in den positiven Bereich verschieben (dabei wird das positive aber Negativ).

+32768 = -Low(SmallInt)

Delphi-Quellcode:
var Zahl: SmallInt;
begin
  Inc(Zahl, 32768);
  ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl));




function HexToInt(HexNum: string): SmallInt;
begin
  Result:=StrToInt('$' + HexNum);
end;

// bzw.

function HexToInt(HexNum: string): Integer;
begin
  Result:=StrToInt('$' + HexNum) - 32768;
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 12:18
Hallo Carsten1234,

InttoHex(zahl,4) liefert bei -5 FFFFFFFB und bei 5 0005. Da hat wohl jemand etwas geschlampt. Für Dich heißt das einfach, die ersten 4 Buchstaben zu löschen wenn Dein String länger als 4 ist.
Oder Du arbeitest mit InttoHex(zahl,8) dan haben positive und negative Werte das gleiche Format. Auch wenn
Delphi-Quellcode:
var
  zahl:smallint; //16Bit
ist.

Ausserdem ist Dein Hi/Lo-Problem mit erschlagen.

Irgendwie bezweifele ich, daß chr(hi(zahl)) einen Hexwert ergibt.

Gruß
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#8

Re: Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 13:49
Zitat von p80286:
Hallo Carsten1234,

InttoHex(zahl,4) liefert bei -5 FFFFFFFB und bei 5 0005. Da hat wohl jemand etwas geschlampt.
Das entspricht genau dem, was die Delphi Hilfe zu IntToHex sagt:

Zitat:
Mit dem Parameter Digits kann festgelegt werden, wie viele Hexadezimalstellen mindestens zurückgegeben werden.
Auch wenn da acht Stellen zurück kommen, sind das auf jeden Fall mehr, als mindestens vier.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 17:39
OK formal ganz richtig,

aber wenn ich einen 16Bit-Wert hineinstopfe dann erwarte ich keine Ausgabe für einen 32Bit-Wert. Dann muß mir erst einmal einfallen, daß intern mit 32Bit gearbeitet wird.

Gruß
K-H
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Negative HEX-Werte übertragen

  Alt 12. Mär 2009, 18:04
Mal was probiert
Delphi-Quellcode:
var
  HexStr : String;
  Zahl : SmallInt;
begin
  Zahl := -200;

  // Zahl wandeln
  HexStr := IntToHex(Hi(Zahl),2) + IntToHex(Lo(Zahl),2);

  // HexStr jetzt 4 Zeichen langer Hexcode
  Edit1.Text := HexStr;

  // Zurück Wandeln, kommt auch tatsächlich -200 raus
  Edit2.Text := IntToStr( SmallInt(StrToInt('$'+HexStr)));
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:12 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