HEX Daten einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
muekno
User
Beiträge: 20
Registriert: Dienstag 28. Januar 2020, 18:20

Hallo
ich habe eine Datei, die enthält
0x23,0xFF,0x44,0x24..... usw.
Diese soll in eine array eingelesen werden.
Das funktioniert auch soweit

Code: Alles auswählen

f open("file","r")
data[]
for i in range(0,20)
	data.append(tmp.read(5))			# ein wert = 5 Zeichen "0x33,"
	
Nun steht das ab als ASCII im array, ich brauch aber den Wert.
Mit x.replace(",","") bekomme ich noch das trailing Komm weg aber immer noch keinen Wert. in C kann ich eine Datentyp für das array deklarieren, in python scheinbar nicht, bin python Anfänger, habe aber schon viel in PHP, C, C++ und Assembler gemacht.
Vielen Dank für eine Typ.
Gruß
Rainer

P.S. auch Google habe ich schon bemüht, leider ohne Erfolg
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was würde denn die Deklaration eines Datentypen ändern? Du musst die rechte Seite einer Zuweisung auch da erstmal wandeln. Genau wie in Python.

Und so wie du macht man das nicht. Unter Ignoranz von whitespace geht das so:

Code: Alles auswählen

with open(filename) as inf:
    data = [int(v, 16) for v in inf.read().split(",")]
muekno
User
Beiträge: 20
Registriert: Dienstag 28. Januar 2020, 18:20

Super Danke, bin halt noch Python Anfänger.
Nun aber gleich noch ne Frage, die Daten sollen später via CAN Bus verschickt werden.

Code: Alles auswählen

 msg = can.Message(arbitration_id=0xc0ffee,                      # send start message L_Info
            data=[source_ID, 0x02, target_ID, 0x03, 0xEE, 125],     # target node should be variable
            is_extended_id=False) 
Das funktioniert, wenn ich nun aber das array data vorher fülle, eben aus meinen Datei und

Code: Alles auswählen

 msg = can.Message(arbitration_id=0xc0ffee,
                        data[],
                        is_extended_id=False)
schreibe bekomme ich eine Fehlermeldung

Code: Alles auswählen

  File "./canconfig", line 95
    data,
    ^
SyntaxError: positional argument follows keyword argument
Danke für Hilfe
Gruß
Rainer
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Irgendwie sieht die bemängelte Zeile im Fehlercode anders aus als im Code.
Was sollen die leeren eckigen Klammern hinter data? Wenn du auf ein Elemnt der Liste zugreifen möchtest, nimmst du das mit eckigen Klammern, aber leer sollten sie nie sein:

Code: Alles auswählen

>>> a = [1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4, 5]
>>> a[1]
2
>>> a[]
SyntaxError: invalid syntax
Und ansonsten ist die Fehlermeldung sehr aussagelkräftig. Wenn man eine Funktion aufruft, dann übergibt man ihr Parameter. Die sind entweder anhand ihrer Position oder ihres Namens zugeordnet. Aber du kannst nicht erst welche über den Namen ansprechen und dann welche über die Position. Dann weiß der Interpreter natürlich nicht mehr, welchen Parameter du meinst.

Code: Alles auswählen

>>> def test(para1, para2, para3):
	print(para1, para2, para3)

	
>>> test(1, 2, 3)
1 2 3
>>> test(para2=2, para1=1, para3=1)
1 2 1
>>> test(para2=1, 2, 3)
SyntaxError: positional argument follows keyword argument
Zuletzt geändert von sparrow am Dienstag 28. Januar 2020, 20:05, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Syntax ist doch komplett geraten. Ich weiß nicht von welcher sprache du das hast, aber in Python darf man nicht einfach [] hinter Variablennamen schreiben. Das ist ein Operator der was damit tut. Kein Typ-Marker.

Und schau dir mal dein eigenes Beispiel genau an, und lies mal im Python Tutorial die Beschreibung von Funktionsargumenten durch: https://docs.python.org/3/tutorial/cont ... -arguments
muekno
User
Beiträge: 20
Registriert: Dienstag 28. Januar 2020, 18:20

Sorry, ich habe das auch erst mal ohne die [] gemacht, aber genau die selbe Fehlermeldung bekommen, das mit Klammern war ein Verzweiflungsversuch, hatte dann nur eine Version cut and paste übernommen. Wie gesagt die obere Version mit den Daten in der Klammer funktioniert. Da ich aber die Daten aus meiner Datei verwenden will muss ich "data", was ja ein array zu sein scheint vorher füllen und dann übergeben. Das Füllen auch der Datei innerhalb der Versorgung von msg also ...ee, data=[ hier füllen ]... ist wohl auch möglich aber für mich als Anfänger etwas zu Komplex und macht das ganze wohl recht unübersichtlich.
Gruß und Dank
Rainer

Der Aufruf ist von hier https://python-can.readthedocs.io/en/master/
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du versuchst gerade auf teufel komm raus syntax und Semantik zu erraten. Das geht nicht. Bei so vielen Sprachen die du angibst zu beherrschen eine etwa überraschende Vorgehensweise.

Hast du den von mir gezeigten link, und noch besser das Tutorial als ganzes Mal durchgearbeitet? Dann wird auch klar, was [] sind, und was nicht. Gerade bei jemand mit vorerfahrung sollte das keine große Hürde sein.
muekno
User
Beiträge: 20
Registriert: Dienstag 28. Januar 2020, 18:20

Danke ich habs gefunden, ich fülle ein eigenes array z.B. mydata und schreibe

Code: Alles auswählen

msg = can.Message(arbitration_id=0xc0ffee,
                        data=mydata,
                        is_extended_id=False)
Gruß

Rainer
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schön 👍🏻 Jetzt noch kurz der Hinweis das die Datenstruktur in Python die du benutzt eine Liste ist. Es gibt auch arrays, aber die sind seltener im Einsatz.
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das `my` in `mydata` macht wenig Sinn sofern es nicht auch `ourdata` und/oder `theirdata` gibt, um das voneinander abzugrenzen. Das hat keinen Mehrwert über ein einfaches `data` als Namen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten