Ich brauche einen smarten Ansatz

Bitte aktiviere JavaScript!
Hallo zusammen,

ich entwickele gerade eine Schnittstelle zu einem USB Gerät. Ich bekommen von dieser Schnittstelle ein byte-Array b, welches ich zu einem String umwandele.

Java:
new String(b, Charset.forName("utf-8"))
Das funktioniert soweit, alles ist gut. Mein Problem ist, dass dieses byte Array einzelne bytes hat, die als Trennzeichen und gleichzeitig Identifier für die darauffolgenden bytes dient, welche Klartext sind. Wenn z.B. 0x87 gefunden wird, ist alles was darauf folgt ein Name bis zum nächsten Identifier. Eine Liste der Identifier liegt natürlich vor, jedoch ist die Reihenfolge nicht zwingend immer die Gleiche.

Wie würdet ihr hier am ehesten vorgehen? Alle möglichen Ansätze die ich bisher in meinem Kopf hatte wirkten irgendwie umständlich und altbacken.

Ein paar Vorschläge würden mich sehr freuen
VG MM
 
Zuletzt bearbeitet:
Ganz grob:
Mit einer Schleife drüber laufen, dabei testen ob ein byte ein Identifier ist.
Wenn nein, das aktuelle Byte einer Liste hinzufügen
Wenn ja, ergibt der aktuelle Listeninhalte ein "Wort" und kann irgendwo gespeichert werden


Oder wenn man mehr abstrahieren will:
'ne Split-Funktion für Arrays, die alle Identifier bekommt und an denen das Array teilt. Ergibt dann ein Array von Arrays, in den inneren Arrays ist das erste byte der Identifier und der Rest das "Wort" (oder alternativ direkt in eine Liste von Tupeln (Identifier, Wort) splitten)
 
Damit ich das richtig verstehe: es gibt ein Byte das sowohl Trennzeichen als auch Identifier ist. Woher weißt Du, ob es ein Trennzeichen ist?
 
Ich hab das auch so verstanden, daß ein Identifier gleichzeitig auch Trenner ist.

Ich hab keine Ahnung was dahinter steckt, aber ich halte die Implementierung für schwach...sowas fällt E-Technikstudenten, die Hardware bauen, meist als erstes ein. Ein Problem ist z.B., daß 0x87 nicht mehr in den Daten auftauchen darf. Blöd, wenn man dann aber z.B. Integer übertragen will, wo ein Byte diesen Wert annehmen könnte.
Vielleicht reicht es ja auch, aber auf den ersten Blick ist das eine unschöne Sache, da bessere Protokolle nicht komplizierter sind (auch für einfache Mikrocontroller).

Wenn es schicker sein soll als eine schnöde Schleife: Ich würde mir einen IOStream daraus bauen, der die Nutzdaten einzeln ausgibt und die Splittung intern vornimmt. Dazu eine Methode identifierNext(), die ein Enum auswirft um das nächste Nutzdatum zu klassifizieren.
 
Ich hab keine Ahnung was dahinter steckt, aber ich halte die Implementierung für schwach...sowas fällt E-Technikstudenten, die Hardware bauen, meist als erstes ein. Ein Problem ist z.B., daß 0x87 nicht mehr in den Daten auftauchen darf. Blöd, wenn man dann aber z.B. Integer übertragen will, wo ein Byte diesen Wert annehmen könnte.
Wenn vor jedem Wert ein Identifier steht, dürften Integer kein Problem sein, haben ja ne feste Länge. Problem sind doch nur Werte unbekannter Länge, dürften nur Stings sein, und wenn man das auf Ascii begrenzt bleibt noch alles ab 0x80 für Identifier übrig.
 
Ich bin ja auch nicht davon ausgegangen, daß nur Integer drinstehen...sondern auch. Sonst wäre es ja wirklich kein Problem.
 
Eigentlich saß ich im Biergarten ^^ ich merke es war vielleicht nicht ganz verständlich. Der Einfachheit halber seien die Trennzeichen im unteren Beispiel druckbare Zeichen.

!vorname&nachname%geburtstag#straße....

Das ! Indiziert dass alle Zeichen danach bis & zum Vornamen gehören. Je gesagt, die Reihenfolge ist aber nicht gesetzt. Es könnte genauso gut sein:

%geburtstag#straße&nachname!vorname...

Die Trennzeichen werden nie nochmal auftauchen, denn das sind keine druckbaren Zeichen. Der Inhalt hingegen ist immer druckbar
 
Wie gesagt: IOStream, der die Splittung intern vornimmt und die Daten ausgibt. Zusätzlich mit einer Methode, die mit einem Enum anzeigt was für ein Datum als nächstes kommt.

So habe ich jedenfalls mal eine ähnliche Aufgabe gelöst. War ganz nett, da der Stream auch als Speicher herhalten konnte.
 
Meine Frage hat sich im übrigen erledigt. Ich habe nämlich etwas übersehen. Es gibt noch ein weiteres Byte, welches mir die Länge des Datensatzes angibt. Also sinngemäß

!5Moxxi&8Managarm...

Damit ist das Ganze straight forward

Danke euch dennoch, war lustig wieder von euch zu lesen bei meinem kurzen Ausflug zurück in die Java Welt :cool:
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben