Seite 1 von 1
Umrechnen einer Zahl in Hexformat
Verfasst: Donnerstag 28. Mai 2015, 15:51
von kleinerflo
Hallo bin gerade dabei ein Python script für meine Heizung zu erstellen der mir das Wetter ausgibt.
Dieser Teil funktioniert auch schon Problemlos nur habe ich die möglichkeit die Daten über einen Socket an den Heizungsregler zu Transportieren.
Die Digital Variante ist relativ simpel und geht auch im Test schon.
Nur komme ich bei Analogen werten nicht weiter da diese auf HEX umgerechnet werden müssen und dies noch von hinten nach vorne gelesen werden müssen script läuft auf 2.7 auf einen Raspberry
Beispiel 03 05 = 1283 wird dann am Regler als 128,3 Interpretiert
oder 0B 02 = 504 ist dann 50,4
Hoff Ihr könnt mir hier helfen
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Donnerstag 28. Mai 2015, 15:58
von Sirius3
@kleinerflo: da hilft Dir das struct-Paket weiter:
Code: Alles auswählen
print struct.pack('<h', int(128.3 * 10)).encode('hex')
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Donnerstag 28. Mai 2015, 16:35
von jens
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Donnerstag 28. Mai 2015, 17:45
von kleinerflo
Vielen Dank das Struct hat mir in dem fall schon weitergeholfen jetzt muss ich nur schauen wie ich den ganzen Hex zusammensetze die anderen Zahlen sind nämlich fix und muss am schluss 14 byte ergeben
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Donnerstag 28. Mai 2015, 18:30
von Sirius3
@kleinerflo: dann würde ich ja die restlichen Werte mit in das struct packen.
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Donnerstag 28. Mai 2015, 21:32
von kleinerflo
Das ich alles ins struct übernehme habe ich so nicht gebacken bekommen habe es jetzt etwas anders gelöst das ich sie am schluss alle zusammensetze.
Würde jetzt nur gern die anderen zahlen als dezimal eingeben dann als 2 bit hex wieder ausgeben habe nur das problem wenn die zahl zu klein ist bekomme ich an fehler. Die eine zahl kann von 1 bis 52 sein und die andere von 1 bis 64
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Donnerstag 28. Mai 2015, 22:25
von Sirius3
zeig doch mal, was Du haben willst.
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 09:10
von kleinerflo
Also der Aufbau des UDP Paketes muss folgender maßen ausschauen
B1 B2 B3 B4 B5 B6 B6 B7 B8 B9 B10 B11 B12 B13 B14
B1 = Knotennummer soll als Dezimal von 1 - 52 Eingegeben werden und dann umgerechnet auf HEX
B2 = Datensatz nummer wird ebenfalls als Dezimal von 1 bis 64 eingegeben und dann auf HEX
B3 und B4 = Zahl 1
B5 und B6 = Zahl 2
B7 und B8 = Zahl 3
B9 und B10 = Zahl 4
B11 bis B14 = Einheit ist ebenfalls eine Dezimal zahl von 1 - 25 die auf HEX umgerechnet wird
Die Hexumrechnung mach mir eben Probleme wenn ich unter die 16 komme das der Script abbricht
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 09:22
von jens
d.h. du brauchst eine prefix 0 ?!?
Code: Alles auswählen
>>> print "%x" % 12
c
>>> print "%02x" % 12
0c
>>> print "%02X" % 12
0C
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 09:30
von kleinerflo
Genau aber nur bei den Kleinen zahlen bei den größeren muss die null wieder weck
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 09:39
von bwbg
Man kann Werte nicht auf HEX
umrechnen. Binär (2), oktal (8), dezimal (10), hexadezimal (16) sind lediglich Repräsentationen von Werten. Die hexadezimale Repräsentation von Bytes hat sich eingebürgert, weil sie sich gut darstellen lässt. 1 Byte kann durch 2 Stellen dargestellt werden (Wertebereiche 0 bis 255, -127 bis 127).
Wenn Du UDP-Pakete zusammen baust (Byte-Strings) ist, wie oben schon erwähnt, das struct-Modul Dein Freund:
Code: Alles auswählen
>>> import struct
>>> value = 128.3
>>> struct.pack('<H', int(value*10)) # '<H' unsigned short, little endian
b'\x03\x05'
>>> struct.unpack('<H', b'\x03\x05')
(1283,)
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 11:15
von snafu
bwbg hat geschrieben:Man kann Werte nicht auf HEX umrechnen. Binär (2), oktal (8), dezimal (10), hexadezimal (16) sind lediglich Repräsentationen von Werten.
Was soll denn sonst eine Umrechnung sein? Die Umrechnung z.B. von Euro in Dollar ist ja so gesehen auch nur eine andere Repräsentation des Euros. Oder wenn ich 1,5kg schreibe, dann ist das eine andere Repräsentation für 1.500g, usw.
Und auch der Wert ist ein anderer. Denn 1,5 ist wohl ohne Zweifel etwas anderes als 1.500. Es kommt halt darauf an, in welchem System der Wert interpretiert wird. Und falls man möchte, dass ein Wert von System A in System B überführt wird und sozusagen seine Bedeutung behält, dann macht man eine *Umrechnung*.
Was du wahrscheinlich meintest, ist dass man oftmals einen "Original-Wert" hinter den Kulissen verwendet und erst für die Anzeige beim Benutzer entsprechende Konvertierungen durchführt. Aber auch dies sind Umrechnungen.
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 12:17
von Sirius3
@snafu: worauf bwbg hinaus will, ist, dass der OP gar keine Hex-Darstellung der Bytes will, sondern in Wirklichkeit tatsächlich einen Bytestring. Da ist es dann wenig hilfreich, über Stringformatierung irgendwelche Darstellungen zu haben.
Code: Alles auswählen
message = struct.pack('<bb4h4b', knotennummer, datensatznummer, zahl1, zahl2, zahl3, zahl4, einheit1, einheit2, einheit3, einheit4)
wobei natürlich zahl1, usw. keine guten Namen sind und das statt dessen nach dem Zweck der Zahl benannt werden sollte.
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 13:11
von bwbg
Sirius3 hat geschrieben:@snafu: worauf bwbg hinaus will, ist, [...]
Danke für die Übersetzung

Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 14:17
von kleinerflo
Danke ich bekomme nur kein richtiges ergebniss bei den zahlen 1 bis 4
vorher mit ZAHL1 = struct.pack('<h', int((Wetter[0][2]) * 10)).encode('hex') kahm hier das richtige raus
nur kann ich so die zahl1 nicht mehr in deine Zeile packen wo habe ich hier den denkfehler drin
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 14:35
von Sirius3
@kleinerflo: Du hast jetzt 1 struct und füllst dort alle Zahlen auf einmal ein.
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 16:12
von kleinerflo
Hab das so vorher schon probiert aber das HEX ergebniss stimmt nicht habe ZAHL 1 einmal mit 123.5 gefüllt
mit ZAHL 1 = 123.5
dann die Zeile von dir übernommen
message = struct.pack('<bb4h4b', knotennummer, datensatznummer, zahl1, zahl2, zahl3, zahl4, einheit1, einheit2, einheit3, einheit4)
Normal sollte für zahl 1 03 05 kommen aber mit deiner Zeile kommt 7B 00
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Freitag 29. Mai 2015, 16:29
von BlackJack
@kleinerflo: Vielleicht solltest Du Dich mal damit beschäftigen wie Zahlen und Darstellungen von Zahlen als Bytes funktionieren. 123.5 kann man nicht als ganze Zahl darstellen weil das keine ganze Zahl ist. Der ganzzahlige Anteil davon ist 123 und das ist 7B 00 als „little endian“ 16-Bit Hexzahl. Das was Du haben möchtest ist eine andere ganze Zahl die aus 123.5 berechnet wird und dann in einen 16-Bit-Wert gepackt wird. Das hatten wir hier im Thema aber schon mal richtig!
Re: Umrechnen einer Zahl in Hexformat
Verfasst: Samstag 30. Mai 2015, 14:50
von kleinerflo
Vielen Dank noch einmal habe es gestern Abend dann noch Rausbekommen was falsch ist
zahl1 = 123.5 * 10
message = struct.pack('<bb4h4b', knotennummer, datensatznummer, zahl1, zahl2, zahl3, zahl4, einheit1, einheit2, einheit3, einheit4)