senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
Syria1993 schrieb: […] Es ist abhängig vom String, was die Funktion übersetzt.... 'DEADBEEF' wird genau so übersetzt wie benötigt aber die Folge '537472696e67' wird in den String übersetzt... Wer da eine Idee hat 👿
Das ist egal. Heraus kommt immer ein Bytearray. Wenn ein Byte als Zeichen dargestellt werden kann wird es als solches dargestellt. Sonst wird der Hexcode angezeigt. Intern, also im Speicher, ist es noch immer ein Byte. Beispiel:
| for i in range(61, 90):
print(bytearray.fromhex(str(i)))
|
Ausgabe:
bytearray(b'a')
bytearray(b'b')
bytearray(b'c')
bytearray(b'd')
bytearray(b'e')
bytearray(b'f')
bytearray(b'g')
bytearray(b'h')
bytearray(b'i')
bytearray(b'p')
bytearray(b'q')
bytearray(b'r')
bytearray(b's')
bytearray(b't')
bytearray(b'u')
bytearray(b'v')
bytearray(b'w')
bytearray(b'x')
bytearray(b'y')
bytearray(b'\x80')
bytearray(b'\x81')
bytearray(b'\x82')
bytearray(b'\x83')
bytearray(b'\x84')
bytearray(b'\x85')
bytearray(b'\x86')
bytearray(b'\x87')
bytearray(b'\x88')
bytearray(b'\x89')
Ignoriere die andere Darstellungsweise einfach. In Beispiel 3 hast du mit „#Eg“ ja auch darstellbare Zeichen drinnen.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Syria1993 schrieb:
Ich habe es mit der Funktion bytearray.fromhex() versucht aber da spielt mir Python einen Streich... schaut mal: | print ("1. fromhex('DEADBEEF'):", bytearray.fromhex("DEADBEEF") )
#1. fromhex('DEADBEEF'): bytearray(b'\xde\xad\xbe\xef')
print ("2. Fromhex('537472696e67'):", bytearray.fromhex("537472696e67"))
#2. Fromhex('537472696e67'): bytearray(b'String')
print ("3. Fromhex('0123456789ABCDEF'):", bytearray.fromhex("0123456789ABCDEF"))
#3. Fromhex('0123456789ABCDEF'): bytearray(b'\x01#Eg\x89\xab\xcd\xef')
|
Wieso "Fromhex"? Du willst doch "ToHex"!
Es ist abhängig vom String, was die Funktion übersetzt.... 'DEADBEEF' wird genau so übersetzt wie benötigt aber die Folge '537472696e67' wird in den String übersetzt... Wer da eine Idee hat 👿
s.o.
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
rklm schrieb: […] Wieso "Fromhex"? Du willst doch "ToHex"!
Wenn das Inputargument für das Skript als Binärdaten in hexadezimaler Darstellung interpretiert werden soll würde fromhex eigentlich passen. Zitat aus der Doku: This bytearray class method returns bytearray object, decoding the given string object. The string must contain two hexadecimal digits per byte, with ASCII spaces being ignored.
| >>> bytearray.fromhex('2Ef0 F1f2 ')
bytearray(b'.\xf0\xf1\xf2')
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
senden9 schrieb: rklm schrieb: […] Wieso "Fromhex"? Du willst doch "ToHex"!
Wenn das Inputargument für das Skript als Binärdaten in hexadezimaler Darstellung interpretiert werden soll würde fromhex eigentlich passen.
Jetzt bin ich verwirrt: ich dachte, der Input sind beliebige Binärdaten, die Du verschlüsseln und dann als Hexzeichen versenden willst. Auf der empfangenden Seite muss man den Prozess natürlich umgekehrt machen.
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
Binärdaten kann man als Hexstring in druckbaren Zeichen darstellen. Könnte man auch mit Base64. Ich bin mir auch nicht sicher ob hier Binärdaten oder Text übertragen werden soll. Rätselraten macht an der Stelle aber wenig Sinn. Syria1993 wird schon wissen was übertragen werden soll.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
senden9 schrieb: Binärdaten kann man als Hexstring in druckbaren Zeichen darstellen. Könnte man auch mit Base64. Ich bin mir auch nicht sicher ob hier Binärdaten oder Text übertragen werden soll.
Also, hier sieht es so aus, als ob die Übergabe der Daten an den sendenden Prozess per Hexzeichen erfolgt.
Rätselraten macht an der Stelle aber wenig Sinn. Syria1993 wird schon wissen was übertragen werden soll.
Ach ja, Du bist ja gar nicht der OP. 😬
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
rklm schrieb: […] Also, hier sieht es so aus, als ob die Übergabe der Daten an den sendenden Prozess per Hexzeichen erfolgt. […]
Eben. Und mit fromhex() kann man einen String welcher aus Hexzeichen besteht in ein äquivalentes Bytearray umwandeln. Ich gehe jetzt mal davon aus das die ganze Arbeit in diesem Pythonskript erledigt werden soll. Also Daten rein –> umwandeln –> verschlüsseln –> über CAN senden –> ===(CAN-Bus)=== –> Daten empfangen –> Daten entschlüsseln –> irgendetwas damit machen.
Auf der Empfängerseite kann man dann die Daten interpretieren und Aktionen auslösen oder mit bytearray.hex() wieder in einen Hexstring konvertieren und ausgeben. Edit: Wobei ich mich gerade Frage ob das ganze eine Sinn hat und in einem Projekt verwendet wird oder eher eine Übung ist mit CAN umzugehen.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
senden9 schrieb: rklm schrieb: […] Also, hier sieht es so aus, als ob die Übergabe der Daten an den sendenden Prozess per Hexzeichen erfolgt. […]
Eben. Und mit fromhex() kann man einen String welcher aus Hexzeichen besteht in ein äquivalentes Bytearray umwandeln. Ich gehe jetzt mal davon aus das die ganze Arbeit in diesem Pythonskript erledigt werden soll. Also Daten rein –> umwandeln –> verschlüsseln –> über CAN senden –> ===(CAN-Bus)=== –> Daten empfangen –> Daten entschlüsseln –> irgendetwas damit machen.
Vor dem Verschlüsseln umwandeln ergibt keinen Sinn. Ich sehe da eher
Irgendeine Eingabe lesen Verschlüsseln (ergibt binäre Daten) Umwandeln in Hex Über CAN senden Empfangen Hex nach binär umwandeln Entschlüsseln Etwas mit der ursprünglichen Eingabe machen
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
Der Formatstring zum erstellen der Struktur lauten „=IB3x8s“. 8s bedeutet laut Dokumentation 8 Bytes. Also werden als letztes Argument von struct.pack Bytes erwartet. Diese Funktion wird in „build_can_frame“ verwendet welches zum bauen des Pakets versendet wird. Funktionen zum Verschlüsseln, wie Fernet.encrypt(data), erwarten ebenfalls häufig die Eingabedaten als Bytes. Den Rückgabewert von .encrypt() kann man dann so lassen wie er ist und direkt über CAN übertragen. Oder man nutzt das wissen über Fernet aus (gibt einen binären Base64-String zurück) und dekodiert die Daten nochmal über base64.b64decode(). Dadurch könnte man nochmal ~25.9% an Datengröße sparen. Ist aber nicht notwendig. Somit muss man, meiner Meinung nach, die Eingabedaten sehr wohl zuerst in ein binäres Format bringen. Umwandeln in Hex muss man IMHO auf der Senderseite gar nicht.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
senden9 schrieb: Der Formatstring zum erstellen der Struktur lauten „=IB3x8s“. 8s bedeutet laut Dokumentation 8 Bytes. Also werden als letztes Argument von struct.pack Bytes erwartet. Diese Funktion wird in „build_can_frame“ verwendet welches zum bauen des Pakets versendet wird.
OK, ich war noch von der Shell-Lösung ausgegangen. Die benutzt cansend, das die Daten hex kodiert übergeben bekommen möchte. Da war das Missverständnis.
Funktionen zum Verschlüsseln, wie Fernet.encrypt(data), erwarten ebenfalls häufig die Eingabedaten als Bytes. Den Rückgabewert von .encrypt() kann man dann so lassen wie er ist und direkt über CAN übertragen. Oder man nutzt das wissen über Fernet aus (gibt einen binären Base64-String zurück) und dekodiert die Daten nochmal über base64.b64decode(). Dadurch könnte man nochmal ~25.9% an Datengröße sparen. Ist aber nicht notwendig.
Aber das ist doch von hinten durch die Brust ins Auge: erst lässt man Fernet verschlüsseln, das einen Base64 kodierten String erzeugt, um den danach dann wieder nach binär umzuwandeln. Dann kann man doch gleich AES für Python benutzen, wenn Fernet so ein ungünstiges Ausgabeformat hat.
Somit muss man, meiner Meinung nach, die Eingabedaten sehr wohl zuerst in ein binäres Format bringen. Umwandeln in Hex muss man IMHO auf der Senderseite gar nicht.
Wozu? Alle Daten liegen doch immer binär vor. Dann braucht man für die Python-Lösung doch nur dies: Irgendeine Eingabe lesen Verschlüsseln (ergibt binäre Daten) Über CAN senden Empfangen Entschlüsseln Etwas mit der ursprünglichen Eingabe machen
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
rklm schrieb: […] Aber das ist doch von hinten durch die Brust ins Auge: erst lässt man Fernet verschlüsseln, das einen Base64 kodierten String erzeugt, um den danach dann wieder nach binär umzuwandeln. Dann kann man doch gleich AES für Python benutzen, wenn Fernet so ein ungünstiges Ausgabeformat hat.
Ich muss zugeben das ich das Ausgabeformat von Frenet erst gesehen als ich den Beitrag oben verfasst habe. Aber auch die von dir vorgeschlagene Methode erfordert auch einen byte string als Parameter. 😀 Gefühl dauert die „Diskussion“ länger als das Schreiben des ganzen Programmes (was ich vermutlich schön getan hätte wenn ich die Hardware dazu hätte).
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
senden9 schrieb: rklm schrieb: […] Aber das ist doch von hinten durch die Brust ins Auge: erst lässt man Fernet verschlüsseln, das einen Base64 kodierten String erzeugt, um den danach dann wieder nach binär umzuwandeln. Dann kann man doch gleich AES für Python benutzen, wenn Fernet so ein ungünstiges Ausgabeformat hat.
Ich muss zugeben das ich das Ausgabeformat von Frenet erst gesehen als ich den Beitrag oben verfasst habe.
Oh.
Aber auch die von dir vorgeschlagene Methode erfordert auch einen byte string als Parameter. 😀
Ja, aber dann liest man halt die Datei oder was auch immer binär ein. Python kann das ja, und auch Kommandozeilenargumente können direkt nach binär gewandelt werden, wenn die Eingabe von dort kommen soll.
Gefühl dauert die „Diskussion“ länger als das Schreiben des ganzen Programmes [...].
Ja, aber es geht ja auch darum etwas zu lernen. Insofern ist das keine verschwendete Zeit, finde ich. Für mich war das Anlass, mal ein wenig mit Python herumzuspielen. Sonst ist eher Ruby meine Brot-und-Butter-Skriptsprache. ☺
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
rklm schrieb: Ja, aber dann liest man halt die Datei oder was auch immer binär ein. Python kann das ja, und auch Kommandozeilenargumente können direkt nach binär gewandelt werden, wenn die Eingabe von dort kommen soll.
Das hab ich ja gemeint.
Ja, aber es geht ja auch darum etwas zu lernen. Insofern ist das keine verschwendete Zeit, finde ich. Für mich war das Anlass, mal ein wenig mit Python herumzuspielen. Sonst ist eher Ruby meine Brot-und-Butter-Skriptsprache. ☺
Ich war eh ein klein wenig überrascht das du dich zu Python äußerst. Hätte dich eher in die Ruby/Perl/Bash-Ecke eingeordnet.
|
Syria1993
(Themenstarter)
Anmeldungsdatum: 5. September 2016
Beiträge: Zähle...
|
Hallo zusammen, zunächst möchte ich mich bei allen und deren Beitrag zu meinen gedanklichen Hindernissen bedanken. Leider war ich die letzten Tage verhindern mich an die Arbeit zu setzen und ich bin auch sehr erstaunt, dass die zweite Seite der Beitragsliste schon fast voll ist 😊
Irgendeine Eingabe lesen # Mithilfe von argv- Übergabe Verschlüsseln (ergibt binäre Daten) # ergibt in Erster Linie einen String, den man in HEX umwandeln muss. Das geht mit bytearray.fromhex() Über CAN senden # http://elinux.org/Python_Can Empfangen # http://elinux.org/Python_Can Entschlüsseln # bin gerade dabei Etwas mit der ursprünglichen Eingabe machen # ein print reicht aus
Genau das ist der Plan und ich habe es mittlerweile geschafft, es zu implementieren 😈
Ich habe nun auch die genaue Funktionsweise von fromhex() verstanden. Doku lesen bringt Vorteile <.< Ich finde dieses Forum sehr hilfreich und bin dankbar an den Leuten, die sich Zeit für Probleme anderer nehmen. Weiter so 👍
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
Falls das Thema damit für dich erledigt hast kannst du unten noch auf „Als gelöst markieren“ klicken.
|