# Array of Byte to String



## Licht9885 (27 September 2017)

Moin zusammen, 

ich habe hier eine Anlage stehen die mittels Profibus Kommunikation eine Seriennummer als Array of Byte bekommt diese Seriennummer besteht aus Zahlen und Buchstaben die in diesem Array Byteweise kodiert sind. Die Übergebene Struktur ist ein* Array [0..31] of Byte *und muss zur weiteren Bearbeitung in ein String gewandelt werden. Meine Frage daher lautet wie kann ich dieses Array in ein String umwandeln?

Über Hinweise für Lösungswege oder evtl. verweise auf existente Bausteine währe ich dankbar. Die Suche hat leider bisher nicht ganz so viel brauchbares ergeben.


----------



## oliver.tonn (27 September 2017)

Die Werte in den Bytes entsprechen den ASCII codes (Auch bei den Zahlen)?
Dann einfach String in passender Größe (32) anlegen und mit MEMCPY vom Array in den String kopieren.

Von irgendwas mit Internetzugang gesendet


----------



## PN/DP (27 September 2017)

Moin Sebastian,

in den Bytes sind das schon ASCII-Zeichen (also eigentlich CHAR)? Hast Du mal ein Beispiel, was in den Bytes drin steht (die Werte am besten hexadezimal)?
Sind es immer 32 Zeichen oder gibt es eine zusätzliche Information über die Länge des Inhalts?

Ein String unterscheidet sich von einem Byte-Array im Grunde nur dadurch, daß hinter dem letzten Zeichen noch ein Byte mit dem Inhalt 0 (16#00) liegt, damit die Länge des Strings dynamisch sein kann und erkennbar wird. Dein Array ist immer 32 Bytes lang, egal wie viele Bytes tatsächlich Daten enthalten.

Du könntest einfach mit MEMCPY das Array auf ein Zwischen-Array [0..32] of Byte umkopieren und eine 0 in das Byte Zwischen-Array[32] schreiben und dann das Zwischen-Array mit MEMCPY in Deinen Zielstring kopieren. PS: oder wie oliver.tonn schreibt, nur einmal kopieren: gleich in einen String der schon auf die Länge 32 initialisiert ist.

Harald


----------



## oliver.tonn (27 September 2017)

Allerdings ist der Hinweis mit der 16#00 nicht unwichtig, danke Harald.


----------



## Licht9885 (27 September 2017)

Hallo und Danke für die Antworten die seriennummer sieht später folgend aus 

Datum: 20170920 Kundenblock: xxxx Laufende Nummer: xxxx also im Endeffekt als zusammenhängender String 


20170920CH020123


----------



## oliver.tonn (27 September 2017)

Dann sollte das so passen, allerdings wenn das Array mal nicht ganz gefüllt sein sollte muss sichergestellt sein, dass die restlichen Stellen (zumindest die erste) mit 16#00 gefüllt sind, damit das Stringende erkannt wird.


----------



## oliver.tonn (27 September 2017)

Oder Du füllst mit MEMSET den Speicherbereich des Strings vor jeder Übertragung mit 16#00, dann bist Du immer auf der sicheren Seite. Aber bei der Feststellung der Anzahl der zu schreibenden Bytes SIZOF und nicht LEN nehmen.


----------



## PN/DP (27 September 2017)

Licht9885 schrieb:


> die seriennummer sieht später folgend aus
> 
> Datum: 20170920 Kundenblock: xxxx Laufende Nummer: xxxx also im Endeffekt als zusammenhängender String
> 
> ...





PN/DP schrieb:


> Sind es immer 32 Zeichen oder gibt es eine zusätzliche Information über die Länge des Inhalts?


@Licht9885
Du könntest diese Frage noch beantworten,  weil danach richtet sich, wo im Zielstring das 0-Byte plaziert werden muß.

Harald


----------



## Licht9885 (27 September 2017)

Ja die Größe ist immer 32 Zeichen


----------



## Guga (27 September 2017)

Und dann noch die Frage nach der Plattform. In TwinCAT gäbe es z.B. die Utility-Library. 
Da gibt es den ein oder anderen Baustein. Ich glaube der folgende macht genau das was du brauchst. Du muesstest nur dein Byte-Array in ein groesseres Array umkopieren (ARRAY [0..255] OF BYTE
https://infosys.beckhoff.com/index....cplclibutilities_bytearr_to_maxstring.htm&id=


Guga


----------



## Licht9885 (29 September 2017)

> Und dann noch die Frage nach der Plattform. In TwinCAT gäbe es z.B. die Utility-Library.
> Da gibt es den ein oder anderen Baustein. Ich glaube der folgende macht genau das was du brauchst. Du muesstest nur dein Byte-Array in ein groesseres Array umkopieren (ARRAY [0..255] OF BYTE:wink:
> *https://infosys.beckhoff.com/index.p...string.htm&id=*



Moin Danke an alle nochmal für die Antworten,

Die Plattform ist TwinCat 3

und nochmals eine neue Frage wenn ich jetzt einzelne Stellen in diesem Array bearbeiten will z.B den Tag ein Hochzählen oder die Laufende Nummern ein Hochzählen möchte, wie kann das funktionieren. da ich leider nicht oft mit Strings Arbeite bzw. diese Verändern muss, tue ich mich aktuell ein bisschen Schwer damit.


----------



## oliver.tonn (29 September 2017)

Du holst Dir den Bereich mit (Je nach Position) LEFT, RIGHT oder MID aus dem String raus, wandelst ihn in eine Zahl (STRING_TO...), machst damit was, wandelst Ihn wieder in einen String und schiebst Ihn mit REPLACE wieder in den String. Beim Tag musst Du natürlich wegen "Überlauf" aufpassen, hier holst Du dir vielleicht am einfachsten das komplette Datum und fügst noch "." (Oder welches Trennzeichen bei TC das Datum hat) ein und wandelst das dann in ein Datum um und rechnest damit. Bei der laufenden Nummer könntest Du das vermutlich sogar in eine (Seeeeeeeehr lange) Zeile packen, die allerdings dann vermutlich keiner mehr versteht.


----------



## oliver.tonn (29 September 2017)

Hallo Sebastian,
was ich noch vergessen habe sind die führenden Nullen. Wenn Du von einer Zahl etwas abziehst kann sie ja weniger Stellen haben und dann würde das Einfügen mit REPLACE schief gehen. Hier müsstest Du den Bereich im Zielstring entweder mit Nullen vor dem Einfügen füllen oder Du nutzt den FB "FB_FormatString".


----------

