@anogayales: Du machst etwas falsch. So ein Repeater steht für mehr als einen Wert, denn er *wiederholt* das Konstrukt das er enthält ja. Also steht der Name `Field` für eine Sequenz von Zeichenketten. Du übergibst eine Zeichenkette — was ja eine Sequenz von Zeichenketten der Länge 1 ist. So sieht dann halt auch das Ergebnis aus. Du musst dort eine Sequenz von Zeichenketten übergeben und zwar ohne Nullbytes. Die kannst Du zwar ohne Fehlermeldung in den Zeichenketten haben, aber das lässt sich später nicht wieder parsen, weil ein Nullbyte *in* der Zeichenkette nicht mehr vom Nullbyte für das Ende unterschieden werden kann. So wäre es richtig:
Code: Alles auswählen
In [265]: Fields.build(Container(NumFields=2, Field=['hello', 'yay']))
Out[265]: '\x02hello\x00yay\x00'
In [266]: Fields.parse(_)
Out[266]: Container(Field = ['hello', 'yay'], NumFields = 2)
Das hat aber das Problem das Du Dich 1. um das Feld mit der Zahl selber kümmern musst, und 2. so ein `OptionalGreedyRepeater` nicht mehr funktioniert wenn danach noch Daten kommen, die Nullbytes enthalten. Die würde er beim parsen nämlich auch noch zu `CString` verwursten. Was Du an der Stelle haben möchtest ist viel einfacher: Ein `PrefixedArray`:
Code: Alles auswählen
In [273]: Fields = PrefixedArray(CString('Fields'))
In [274]: Fields.build(['hello', 'yay', 'cool'])
Out[274]: '\x03hello\x00yay\x00cool\x00'
In [275]: Fields.parse(_)
Out[275]: ['hello', 'yay', 'cool']
In [276]: Fields.parse(_274 + 'garbage\x00')
Out[276]: ['hello', 'yay', 'cool']
Der `OptionalGreedyRepeater` hätte im letzten Beispiel vier Zeichenketten geliefert obwohl das 'garbage' gar nicht in der Anzahl enthalten ist. Falls Du mal eine andere Grösse für den Zähler als ein Byte benötigst, kannst Du das als zweites Argument beim `PrefixedArray` angeben.