Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich habe ein file im Motorola S-Record Format und möchte die line checksum prüfen. Im Beispiel sind Start code, Record type und Cecksum bereits entfernt, also nur noch die Daten übrig. Gibt es ein Möglichkeit das ohne Schleife durch String Formatierung, Umwandlung oder ähnliches besser zu lösen ?
Zitat:Gibt es ein Möglichkeit das ohne Schleife durch String Formatierung, Umwandlung oder ähnliches besser zu lösen ?
Du hast einen Input-String.
Du willst mit dessen Inhalt eine Rechnung (mit Zahlenwerten!) durchführen.
Du willst dazu den String in seine Einzelwerte zerlegen und jeden Wert auch einzeln behandlen.
Warum willst du für all das auf eine Schleife und etwas Mathematik verzichten? (Wie soll das gehen?)
Was stört dich an deiner vorhandenen Lösung?
ja, ich habe einen Input-String dessen Inhalt ich in Einzelwerte zerlegen und damit rechnen will und nein, ich will nicht jeden einzeln behandeln. Mein file hat über 20.000 Zeilen, sodass diese Schleifenlösung dauert. Ich hoffe auf eine etwas elegantere Lösung und schnellere Lösung. Um bei meinem Beispiel zu bleiben, ich will: 22h + 00h + 00h + 00h + 34h + 63h + ... + 69h rechnen, damit ist Chksum Berechnung noch nicht abgeschlossen, das ist aber das wesentliche Problem. Die Einzelwerte sind immer 2 Characters lang. Habe Versuche mit String deserialisieren und Tabellen-String nach Array gemacht (siehe Anhang), kriegs aber nicht hin.
Gruß
... oder anders gefragt:
Wie kann ich diesen String (ohne Schleife, mit einer Funktion) in ein 1D Array aus zwei Zeichen langen Strings umwandeln ?
14.08.2017, 12:50 (Dieser Beitrag wurde zuletzt bearbeitet: 14.08.2017 13:30 von GerdW.)
Zitat:Wie kann ich diesen String (ohne Schleife, mit einer Funktion) in ein 1D Array aus zwei Zeichen langen Strings umwandeln?
Genau das ist der Knackpunkt.
Dein String ist eben in "normalem" Displaymode und du musst eben erstmal je zwei Zeichen nehmen und dann in eine Zahl umwandeln. Das geht am einfachsten mit einer Schleife…
Wenn der String schon im "Hex-Display" wäre, ginge es einfacher!
Zitat:Mein file hat über 20.000 Zeilen, sodass diese Schleifenlösung dauert.
Die Umwandlung und die Checksum-Berechnung in ein reentrant-VI programmieren. Dann die Zeilen deiner Datei einlesen und mit einer parallelisierten FOR-Loop abarbeiten. Mein Octacore hier arbeitet VIs bei effizienter Programmierung eben auch mit (nahezu) 8facher Geschwindigkeit ab…
Zitat:Wie kann ich diesen String (ohne Schleife, mit einer Funktion) in ein 1D Array aus zwei Zeichen langen Strings umwandeln?
Genau das ist der Knackpunkt.
Dein String ist eben in "normalem" Displaymode und du musst eben erstmal je zwei Zeichen nehmen und dann in eine Zahl umwandeln. Das geht am einfachsten mit einer Schleife…
Wenn der String schon im "Hex-Display" wäre, ginge es einfacher!
Damit er sicher übertragbar ist, liegt so ein Motorola S-Record File aber im "ASCII-Modus" vor...
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
also, mal zur Ansicht (siehe Anhang), die Schleifenlösung ist schon was langsames, mein "Nichtschleifenansatz" ist zwei- bis dreimal schneller. Parallelisierung ist natürlich ein Ansatz, da ich aber nicht genau weiß wie viele S-Records es sind muss man sicher einigen Gehirnschmalz in die "Verteilung" stecken. Ich hatte gehofft durch eine geschickte Transformation des Strings ein Array aus zwei-Zeichen-Strings zu erzeugen, welches ich dann auf die Funktion Hex-String-nach-Zahl gebe und dieses wiederum auf Array addieren usw. Da ist man ja mit der Funktion Tabellen-String nach Array auch nah dran, nur leider gibts im S-Record kein Trennzeichen. Kann ich nicht irgenwie eine Formatierung vorgeben die LV dazu veranlasst immer zwei Zeichen in ein Array-Element zu packen ?
Gruß,
JATler
15.08.2017, 09:08 (Dieser Beitrag wurde zuletzt bearbeitet: 15.08.2017 09:08 von jg.)
Zitat:Kann ich nicht irgenwie eine Formatierung vorgeben die LV dazu veranlasst immer zwei Zeichen in ein Array-Element zu packen ?
Du könntest ScanFromString mit dem Format %2s verwenden - aber ob das jetzt schneller wird…
Zu deiner Umsetzung:
- Bei der zweiten Umsetzung würde ich das "-48" vor dem ArrayDecimate durchführen…
Hier noch ein anderer Ansatz:
Du musst nur die LookupTable (LUT) für die Umwandlung von ASCII-Wert in Zahlenwert vervollständigen, die Tipparbeit habe ich mir hier gespart…
(Edit: auch hier kann die Umwandlung über die LUT natürlich vor dem Decimate durchgeführt werden.)
Zitat:Parallelisierung ist natürlich ein Ansatz
Damit meinte ich die parallelisierte FOR-Loop wie im Bild.