You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2022/01/24 15:49:19 UTC

[plc4x] branch develop updated (15524ae -> 5a05613)

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git.


    from 15524ae  fix(plc4go/codgen): sync code
     new e7dcb11  fix(plc4j/codgen): write encoding of strings fixed
     new 5aa4e72  fix(plc4go/codgen): added missing validation field
     new e9d1dcf  fix(plc4go): switch string reading
     new 5a05613  fix(plc4go): adjusted xml writing

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../resources/templates/go/model-template.go.ftlh  |  10 +
 .../templates/java/model-template.java.ftlh        |   4 +-
 .../protocols/bacnet/ParserSerializerTestsuite.xml | 624 +++++++++++----------
 .../readwrite/model/BACnetApplicationTag.go        |   7 +
 .../bacnetip/readwrite/model/BACnetClosingTag.go   |   7 +
 .../model/BACnetConstructedDataElement.go          |   7 +
 .../bacnetip/readwrite/model/BACnetContextTag.go   |  14 +
 .../readwrite/model/BACnetContextTagBitString.go   |   7 +
 .../readwrite/model/BACnetContextTagBoolean.go     |   7 +
 .../model/BACnetContextTagCharacterString.go       |   7 +
 .../readwrite/model/BACnetContextTagDate.go        |   7 +
 .../readwrite/model/BACnetContextTagDeviceState.go |   7 +
 .../readwrite/model/BACnetContextTagDouble.go      |   7 +
 .../readwrite/model/BACnetContextTagEnumerated.go  |   7 +
 .../readwrite/model/BACnetContextTagEventState.go  |   7 +
 .../readwrite/model/BACnetContextTagEventType.go   |   7 +
 .../readwrite/model/BACnetContextTagNotifyType.go  |   7 +
 .../model/BACnetContextTagObjectIdentifier.go      |   7 +
 .../readwrite/model/BACnetContextTagOctetString.go |   7 +
 .../model/BACnetContextTagPropertyIdentifier.go    |   7 +
 .../readwrite/model/BACnetContextTagReal.go        |   7 +
 .../model/BACnetContextTagSignedInteger.go         |   7 +
 .../readwrite/model/BACnetContextTagTime.go        |   7 +
 .../model/BACnetContextTagUnsignedInteger.go       |   7 +
 .../bacnetip/readwrite/model/BACnetOpeningTag.go   |   7 +
 .../bacnetip/readwrite/model/StaticHelper.go       |   4 +-
 .../spi/testutils/ParserSerializerTestRunner.go    |  15 +-
 .../plc4go/spi/utils/ReadBufferByteBased.go        |   4 +-
 plc4go/internal/plc4go/spi/utils/Utils.go          |   1 +
 .../plc4go/spi/utils/WriteBufferXmlBased.go        |  32 +-
 .../plc4x/java/spi/codegen/FieldCommons.java       |  27 +-
 .../spi/codegen/fields/FieldReaderChecksum.java    |   2 +-
 .../java/spi/codegen/fields/FieldReaderConst.java  |   2 +-
 .../codegen/fields/FieldReaderDiscriminator.java   |   2 +-
 .../java/spi/codegen/fields/FieldReaderEnum.java   |   2 +-
 .../spi/codegen/fields/FieldReaderImplicit.java    |   2 +-
 .../java/spi/codegen/fields/FieldReaderManual.java |   3 +-
 .../spi/codegen/fields/FieldReaderOptional.java    |   2 +-
 .../java/spi/codegen/fields/FieldReaderPeek.java   |   2 +-
 .../java/spi/codegen/fields/FieldReaderSimple.java |   2 +-
 .../spi/codegen/fields/FieldReaderTypeSwitch.java  |   2 +-
 .../java/spi/codegen/fields/FieldWriterArray.java  |   4 +-
 .../spi/codegen/fields/FieldWriterChecksum.java    |   2 +-
 .../java/spi/codegen/fields/FieldWriterConst.java  |   2 +-
 .../codegen/fields/FieldWriterDiscriminator.java   |   2 +-
 .../fields/FieldWriterDiscriminatorEnum.java       |   2 +-
 .../java/spi/codegen/fields/FieldWriterEnum.java   |   2 +-
 .../spi/codegen/fields/FieldWriterImplicit.java    |   2 +-
 .../java/spi/codegen/fields/FieldWriterManual.java |   2 +-
 .../spi/codegen/fields/FieldWriterManualArray.java |   2 +-
 .../spi/codegen/fields/FieldWriterOptional.java    |   2 +-
 .../codegen/fields/FieldWriterOptionalEnum.java    |   2 +-
 .../spi/codegen/fields/FieldWriterPadding.java     |   2 +-
 .../spi/codegen/fields/FieldWriterReserved.java    |   2 +-
 .../java/spi/codegen/fields/FieldWriterSimple.java |   2 +-
 .../spi/codegen/fields/FieldWriterSimpleEnum.java  |   2 +-
 .../java/spi/codegen/io/DataWriterSimpleBase.java  |   3 +-
 .../spi/codegen/io/DataWriterSimpleString.java     |   4 +-
 .../protocols/bacnet/ParserSerializerTestsuite.xml |  32 +-
 59 files changed, 600 insertions(+), 374 deletions(-)

[plc4x] 01/04: fix(plc4j/codgen): write encoding of strings fixed

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit e7dcb11a73e96879c6e710d5966db25e9edef21b
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Jan 24 13:45:02 2022 +0100

    fix(plc4j/codgen): write encoding of strings fixed
---
 .../templates/java/model-template.java.ftlh        |   4 +-
 .../protocols/bacnet/ParserSerializerTestsuite.xml | 624 +++++++++++----------
 .../plc4x/java/spi/codegen/FieldCommons.java       |  27 +-
 .../spi/codegen/fields/FieldReaderChecksum.java    |   2 +-
 .../java/spi/codegen/fields/FieldReaderConst.java  |   2 +-
 .../codegen/fields/FieldReaderDiscriminator.java   |   2 +-
 .../java/spi/codegen/fields/FieldReaderEnum.java   |   2 +-
 .../spi/codegen/fields/FieldReaderImplicit.java    |   2 +-
 .../java/spi/codegen/fields/FieldReaderManual.java |   3 +-
 .../spi/codegen/fields/FieldReaderOptional.java    |   2 +-
 .../java/spi/codegen/fields/FieldReaderPeek.java   |   2 +-
 .../java/spi/codegen/fields/FieldReaderSimple.java |   2 +-
 .../spi/codegen/fields/FieldReaderTypeSwitch.java  |   2 +-
 .../java/spi/codegen/fields/FieldWriterArray.java  |   4 +-
 .../spi/codegen/fields/FieldWriterChecksum.java    |   2 +-
 .../java/spi/codegen/fields/FieldWriterConst.java  |   2 +-
 .../codegen/fields/FieldWriterDiscriminator.java   |   2 +-
 .../fields/FieldWriterDiscriminatorEnum.java       |   2 +-
 .../java/spi/codegen/fields/FieldWriterEnum.java   |   2 +-
 .../spi/codegen/fields/FieldWriterImplicit.java    |   2 +-
 .../java/spi/codegen/fields/FieldWriterManual.java |   2 +-
 .../spi/codegen/fields/FieldWriterManualArray.java |   2 +-
 .../spi/codegen/fields/FieldWriterOptional.java    |   2 +-
 .../codegen/fields/FieldWriterOptionalEnum.java    |   2 +-
 .../spi/codegen/fields/FieldWriterPadding.java     |   2 +-
 .../spi/codegen/fields/FieldWriterReserved.java    |   2 +-
 .../java/spi/codegen/fields/FieldWriterSimple.java |   2 +-
 .../spi/codegen/fields/FieldWriterSimpleEnum.java  |   2 +-
 .../java/spi/codegen/io/DataWriterSimpleBase.java  |   3 +-
 .../spi/codegen/io/DataWriterSimpleString.java     |   4 +-
 .../protocols/bacnet/ParserSerializerTestsuite.xml |  32 +-
 31 files changed, 385 insertions(+), 362 deletions(-)

diff --git a/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh
index c7f7d96..27de56b 100644
--- a/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh
@@ -280,7 +280,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
                         <#assign namedField = field.asNamedField().orElseThrow()>
 
                         // Simple Field (${namedField.name})
-                        <#if helper.isEnumTypeReference(typedField.type)>writeSimpleEnumField("${namedField.name}", "${helper.getLanguageTypeNameForField(field)}", ${namedField.name}, ${helper.getEnumDataWriterCall(typedField.type, namedField.name, "value")});<#else>writeSimpleField("${namedField.name}", ${simpleField.name}, ${helper.getDataWriterCall(typedField.type, namedField.name)});</#if>
+                        <#if helper.isEnumTypeReference(typedField.type)>writeSimpleEnumField("${namedField.name}", "${helper.getLanguageTypeNameForField(field)}", ${namedField.name}, ${helper.getEnumDataWriterCall(typedField.type, namedField.name, "value")});<#else>writeSimpleField("${namedField.name}", ${simpleField.name}, ${helper.getDataWriterCall(typedField.type, namedField.name)}${helper.getFieldOptions(typedField, parserArguments)});</#if>
                         <#break>
                     <#case "switch">
                         <#assign switchField = field.asSwitchField().orElseThrow()>
@@ -688,7 +688,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
                 <#assign validationField = field.asValidationField().orElseThrow()>
                 // Validation
                 if (!(${helper.toParseExpression(validationField, helper.boolTypeReference, validationField.getValidationExpression(), null)})) {
-                throw new ParseAssertException(${validationField.getDescription().orElse("Validation failed")});
+                    throw new ParseAssertException(${validationField.getDescription().orElse("Validation failed")});
                 }
                 <#break>
             <#case "peek">
diff --git a/plc4go/assets/testing/protocols/bacnet/ParserSerializerTestsuite.xml b/plc4go/assets/testing/protocols/bacnet/ParserSerializerTestsuite.xml
index dd2c9e0..5af2a53 100644
--- a/plc4go/assets/testing/protocols/bacnet/ParserSerializerTestsuite.xml
+++ b/plc4go/assets/testing/protocols/bacnet/ParserSerializerTestsuite.xml
@@ -25,7 +25,9 @@
 
   <testcase>
     <name>1	Simple-ACK      acknowledgeAlarm[  2] </name>
-    <raw>810a000b10072c0200003d</raw>
+    <!-- TODO: original pcap contains bytes at the end which will be just ignored so we remove them here. A reserved part is 12 instead of 0-->
+    <!--raw>810a000b10072c0200003d</raw-->
+    <raw>810a00091007200200</raw>
     <root-type>BVLC</root-type>
     <xml>
       <BVLC>
@@ -125,7 +127,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetContextTagOctetString>
-                                <value dataType="string" bitLength="64" encoding="UTF-8">SYNERGY</value>
+                                <value dataType="string" bitLength="64" encoding="ASCII">SYNERGY</value>
                               </BACnetContextTagOctetString>
                             </BACnetContextTag>
                           </objectName>
@@ -852,33 +854,33 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">#!/bin/sh
-      # Unit tests builder / runner for this project
-      
-      rm test.log
-      touch test.log
-      
-      make -f abort.mak clean
-      make -f abort.mak
-      ./abort &gt;&gt; test.log
-      make -f abort.mak clean
-      
-      make -f address.mak clean
-      make -f address.mak
-      ./address &gt;&gt; test.log
-      make -f address.mak clean
-      
-      make -f cov.mak clean
-      make -f cov.mak
-      ./cov &gt;&gt; test.log
-      make -f cov.mak clean
-      
-      make -f dcc.mak clean
-      make -f dcc.mak
-      ./dcc &gt;&gt; test.log
-      make -f dcc.mak clean
-      
-      make -f demo/object/ai</value>
+                                <value dataType="string" bitLength="3584" encoding="ASCII">#!/bin/sh
+                                  # Unit tests builder / runner for this project
+
+                                  rm test.log
+                                  touch test.log
+
+                                  make -f abort.mak clean
+                                  make -f abort.mak
+                                  ./abort &gt;&gt; test.log
+                                  make -f abort.mak clean
+
+                                  make -f address.mak clean
+                                  make -f address.mak
+                                  ./address &gt;&gt; test.log
+                                  make -f address.mak clean
+
+                                  make -f cov.mak clean
+                                  make -f cov.mak
+                                  ./cov &gt;&gt; test.log
+                                  make -f cov.mak clean
+
+                                  make -f dcc.mak clean
+                                  make -f dcc.mak
+                                  ./dcc &gt;&gt; test.log
+                                  make -f dcc.mak clean
+
+                                  make -f demo/object/ai</value>
                               </BACnetApplicationTagOctetString>
                             </BACnetApplicationTag>
                           </fileData>
@@ -1095,27 +1097,27 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">.mak clean
-      make -f demo/object/ai.mak
-      ./analog_input &gt;&gt; test.log
-      make -f demo/object/ai.mak clean
-      
-      make -f demo/object/ao.mak clean
-      make -f demo/object/ao.mak
-      ./analog_output &gt;&gt; test.log
-      make -f demo/object/ao.mak clean
-      
-      make -f demo/object/av.mak clean
-      make -f demo/object/av.mak
-      ./analog_value &gt;&gt; test.log
-      make -f demo/object/av.mak clean
-      
-      make -f arf.mak clean
-      make -f arf.mak
-      ./atomicreadfile &gt;&gt; test.log
-      make -f arf.mak clean
-      
-      make -f awf.mak</value>
+                                <value dataType="string" bitLength="3584" encoding="ASCII">.mak clean
+                                  make -f demo/object/ai.mak
+                                  ./analog_input &gt;&gt; test.log
+                                  make -f demo/object/ai.mak clean
+
+                                  make -f demo/object/ao.mak clean
+                                  make -f demo/object/ao.mak
+                                  ./analog_output &gt;&gt; test.log
+                                  make -f demo/object/ao.mak clean
+
+                                  make -f demo/object/av.mak clean
+                                  make -f demo/object/av.mak
+                                  ./analog_value &gt;&gt; test.log
+                                  make -f demo/object/av.mak clean
+
+                                  make -f arf.mak clean
+                                  make -f arf.mak
+                                  ./atomicreadfile &gt;&gt; test.log
+                                  make -f arf.mak clean
+
+                                  make -f awf.mak</value>
                               </BACnetApplicationTagOctetString>
                             </BACnetApplicationTag>
                           </fileData>
@@ -1332,30 +1334,30 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">clean
-      make -f awf.mak
-      ./atomicwritefile &gt;&gt; test.log
-      make -f awf.mak clean
-      
-      make -f bacapp.mak clean
-      make -f bacapp.mak
-      ./bacapp &gt;&gt; test.log
-      make -f bacapp.mak clean
-      
-      make -f bacdcode.mak clean
-      make -f bacdcode.mak
-      ./bacdcode &gt;&gt; test.log
-      make -f bacdcode.mak clean
-      
-      make -f bacerror.mak clean
-      make -f bacerror.mak
-      ./bacerror &gt;&gt; test.log
-      make -f bacerror.mak clean
-      
-      make -f bacstr.mak clean
-      make -f bacstr.mak
-      ./bacstr &gt;&gt; test.log
-      make -f bacstr.mak</value>
+                                <value dataType="string" bitLength="3584" encoding="ASCII">clean
+                                  make -f awf.mak
+                                  ./atomicwritefile &gt;&gt; test.log
+                                  make -f awf.mak clean
+
+                                  make -f bacapp.mak clean
+                                  make -f bacapp.mak
+                                  ./bacapp &gt;&gt; test.log
+                                  make -f bacapp.mak clean
+
+                                  make -f bacdcode.mak clean
+                                  make -f bacdcode.mak
+                                  ./bacdcode &gt;&gt; test.log
+                                  make -f bacdcode.mak clean
+
+                                  make -f bacerror.mak clean
+                                  make -f bacerror.mak
+                                  ./bacerror &gt;&gt; test.log
+                                  make -f bacerror.mak clean
+
+                                  make -f bacstr.mak clean
+                                  make -f bacstr.mak
+                                  ./bacstr &gt;&gt; test.log
+                                  make -f bacstr.mak</value>
                               </BACnetApplicationTagOctetString>
                             </BACnetApplicationTag>
                           </fileData>
@@ -1572,27 +1574,27 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">clean
-      
-      make -f demo/object/bi.mak clean
-      make -f demo/object/bi.mak
-      ./binary_input &gt;&gt; test.log
-      make -f demo/object/bi.mak clean
-      
-      make -f demo/object/bo.mak clean
-      make -f demo/object/bo.mak
-      ./binary_output &gt;&gt; test.log
-      make -f demo/object/bo.mak clean
-      
-      make -f demo/object/bv.mak clean
-      make -f demo/object/bv.mak
-      ./binary_value &gt;&gt; test.log
-      make -f demo/object/bv.mak clean
-      
-      make -f crc.mak clean
-      make -f crc.mak
-      ./crc &gt;&gt; test.log
-      make -f crc.mak clean</value>
+                                <value dataType="string" bitLength="3584" encoding="ASCII">clean
+
+                                  make -f demo/object/bi.mak clean
+                                  make -f demo/object/bi.mak
+                                  ./binary_input &gt;&gt; test.log
+                                  make -f demo/object/bi.mak clean
+
+                                  make -f demo/object/bo.mak clean
+                                  make -f demo/object/bo.mak
+                                  ./binary_output &gt;&gt; test.log
+                                  make -f demo/object/bo.mak clean
+
+                                  make -f demo/object/bv.mak clean
+                                  make -f demo/object/bv.mak
+                                  ./binary_value &gt;&gt; test.log
+                                  make -f demo/object/bv.mak clean
+
+                                  make -f crc.mak clean
+                                  make -f crc.mak
+                                  ./crc &gt;&gt; test.log
+                                  make -f crc.mak clean</value>
                               </BACnetApplicationTagOctetString>
                             </BACnetApplicationTag>
                           </fileData>
@@ -1809,28 +1811,28 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">make -f demo/object/device.mak clean
-      make -f demo/object/device.mak
-      ./device &gt;&gt; test.log
-      make -f demo/object/device.mak clean
-      
-      make -f iam.mak clean
-      make -f iam.mak
-      ./iam &gt;&gt; test.log
-      make -f iam.mak clean
-      
-      make -f ihave.mak clean
-      make -f ihave.mak
-      ./ihave &gt;&gt; test.log
-      make -f ihave.mak clean
-      
-      make -f indtext.mak clean
-      make -f indtext.mak
-      ./indtext &gt;&gt; test.log
-      make -f indtext.mak clean
-      
-      make -f demo/object/lsp.mak clean
-      make -f demo/object/lsp.</value>
+                                <value dataType="string" bitLength="3584" encoding="ASCII">make -f demo/object/device.mak clean
+                                  make -f demo/object/device.mak
+                                  ./device &gt;&gt; test.log
+                                  make -f demo/object/device.mak clean
+
+                                  make -f iam.mak clean
+                                  make -f iam.mak
+                                  ./iam &gt;&gt; test.log
+                                  make -f iam.mak clean
+
+                                  make -f ihave.mak clean
+                                  make -f ihave.mak
+                                  ./ihave &gt;&gt; test.log
+                                  make -f ihave.mak clean
+
+                                  make -f indtext.mak clean
+                                  make -f indtext.mak
+                                  ./indtext &gt;&gt; test.log
+                                  make -f indtext.mak clean
+
+                                  make -f demo/object/lsp.mak clean
+                                  make -f demo/object/lsp.</value>
                               </BACnetApplicationTagOctetString>
                             </BACnetApplicationTag>
                           </fileData>
@@ -2047,31 +2049,31 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">mak
-      ./lsp &gt;&gt; test.log
-      make -f demo/object/lsp.mak clean
-      
-      make -f demo/object/mso.mak clean
-      make -f demo/object/mso.mak
-      ./multistate_output &gt;&gt; test.log
-      make -f demo/object/mso.mak clean
-      
-      make -f mstp.mak clean
-      make -f mstp.mak
-      ./mstp &gt;&gt; test.log
-      make -f mstp.mak clean
-      
-      make -f npdu.mak clean
-      make -f npdu.mak
-      ./npdu &gt;&gt; test.log
-      make -f npdu.mak clean
-      
-      make -f rd.mak clean
-      make -f rd.mak
-      ./reinitialize_device &gt;&gt; test.log
-      make -f rd.mak clean
-      
-      make</value>
+                                <value dataType="string" bitLength="3584" encoding="ASCII">mak
+                                  ./lsp &gt;&gt; test.log
+                                  make -f demo/object/lsp.mak clean
+
+                                  make -f demo/object/mso.mak clean
+                                  make -f demo/object/mso.mak
+                                  ./multistate_output &gt;&gt; test.log
+                                  make -f demo/object/mso.mak clean
+
+                                  make -f mstp.mak clean
+                                  make -f mstp.mak
+                                  ./mstp &gt;&gt; test.log
+                                  make -f mstp.mak clean
+
+                                  make -f npdu.mak clean
+                                  make -f npdu.mak
+                                  ./npdu &gt;&gt; test.log
+                                  make -f npdu.mak clean
+
+                                  make -f rd.mak clean
+                                  make -f rd.mak
+                                  ./reinitialize_device &gt;&gt; test.log
+                                  make -f rd.mak clean
+
+                                  make</value>
                               </BACnetApplicationTagOctetString>
                             </BACnetApplicationTag>
                           </fileData>
@@ -2288,32 +2290,32 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">-f reject.mak clean
-      make -f reject.mak
-      ./reject &gt;&gt; test.log
-      make -f reject.mak clean
-      
-      make -f ringbuf.mak clean
-      make -f ringbuf.mak
-      ./ringbuf &gt;&gt; test.log
-      make -f ringbuf.mak clean
-      
-      make -f rp.mak clean
-      make -f rp.mak
-      ./readproperty &gt;&gt; test.log
-      make -f rp.mak clean
-      
-      make -f rpm.mak clean
-      make -f rpm.mak
-      ./rpm &gt;&gt; test.log
-      make -f rpm.mak clean
-      
-      make -f sbuf.mak clean
-      make -f sbuf.mak
-      ./sbuf &gt;&gt; test.log
-      make -f sbuf.mak clean
-      
-      make -f tsm.mak cle</value>
+                                <value dataType="string" bitLength="3584" encoding="ASCII">-f reject.mak clean
+                                  make -f reject.mak
+                                  ./reject &gt;&gt; test.log
+                                  make -f reject.mak clean
+
+                                  make -f ringbuf.mak clean
+                                  make -f ringbuf.mak
+                                  ./ringbuf &gt;&gt; test.log
+                                  make -f ringbuf.mak clean
+
+                                  make -f rp.mak clean
+                                  make -f rp.mak
+                                  ./readproperty &gt;&gt; test.log
+                                  make -f rp.mak clean
+
+                                  make -f rpm.mak clean
+                                  make -f rpm.mak
+                                  ./rpm &gt;&gt; test.log
+                                  make -f rpm.mak clean
+
+                                  make -f sbuf.mak clean
+                                  make -f sbuf.mak
+                                  ./sbuf &gt;&gt; test.log
+                                  make -f sbuf.mak clean
+
+                                  make -f tsm.mak cle</value>
                               </BACnetApplicationTagOctetString>
                             </BACnetApplicationTag>
                           </fileData>
@@ -2530,25 +2532,25 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="2584" encoding="UTF-8">an
-      make -f tsm.mak
-      ./tsm &gt;&gt; test.log
-      make -f tsm.mak clean
-      
-      make -f whois.mak clean
-      make -f whois.mak
-      ./whois &gt;&gt; test.log
-      make -f whois.mak clean
-      
-      make -f whohas.mak clean
-      make -f whohas.mak
-      ./whohas &gt;&gt; test.log
-      make -f whohas.mak clean
-      
-      make -f wp.mak clean
-      make -f wp.mak
-      ./writeproperty &gt;&gt; test.log
-      make -f wp.mak clean</value>
+                                <value dataType="string" bitLength="2584" encoding="ASCII">an
+                                  make -f tsm.mak
+                                  ./tsm &gt;&gt; test.log
+                                  make -f tsm.mak clean
+
+                                  make -f whois.mak clean
+                                  make -f whois.mak
+                                  ./whois &gt;&gt; test.log
+                                  make -f whois.mak clean
+
+                                  make -f whohas.mak clean
+                                  make -f whohas.mak
+                                  ./whohas &gt;&gt; test.log
+                                  make -f whohas.mak clean
+
+                                  make -f wp.mak clean
+                                  make -f wp.mak
+                                  ./writeproperty &gt;&gt; test.log
+                                  make -f wp.mak clean</value>
                               </BACnetApplicationTagOctetString>
                             </BACnetApplicationTag>
                           </fileData>
@@ -6393,31 +6395,31 @@
                                       </BACnetTagHeader>
                                     </header>
                                     <BACnetApplicationTagOctetString>
-                                      <value dataType="string" bitLength="3520" encoding="UTF-8">Test "BACnet Abort":
-      	Passed: 260107
-      	Failed: 0
-      Test "BACnet Address":
-      	Passed: 2805
-      	Failed: 0
-      Test "BACnet DeviceCommunicationControl":
-      	Passed: 12
-      	Failed: 0
-      Test "BACnet Analog Input":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet Analog Output":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet Analog Value":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet AtomicReadFile":
-      	Passed: 29
-      	Failed: 0
-      Test "BACnet AtomicWriteFile":
-      	Passed: 25
-      	Failed: 0
-      Test "BACnet Applicat</value>
+                                      <value dataType="string" bitLength="3520" encoding="ASCII">Test "BACnet Abort":
+                                        Passed: 260107
+                                        Failed: 0
+                                        Test "BACnet Address":
+                                        Passed: 2805
+                                        Failed: 0
+                                        Test "BACnet DeviceCommunicationControl":
+                                        Passed: 12
+                                        Failed: 0
+                                        Test "BACnet Analog Input":
+                                        Passed: 4
+                                        Failed: 0
+                                        Test "BACnet Analog Output":
+                                        Passed: 4
+                                        Failed: 0
+                                        Test "BACnet Analog Value":
+                                        Passed: 4
+                                        Failed: 0
+                                        Test "BACnet AtomicReadFile":
+                                        Passed: 29
+                                        Failed: 0
+                                        Test "BACnet AtomicWriteFile":
+                                        Passed: 25
+                                        Failed: 0
+                                        Test "BACnet Applicat</value>
                                     </BACnetApplicationTagOctetString>
                                   </BACnetApplicationTag>
                                 </fileData>
@@ -6664,36 +6666,36 @@
                                       </BACnetTagHeader>
                                     </header>
                                     <BACnetApplicationTagOctetString>
-                                      <value dataType="string" bitLength="3520" encoding="UTF-8">ion Data":
-      	Passed: 66
-      	Failed: 0
-      Test "BACDCode":
-      	Passed: 12617539
-      	Failed: 0
-      Test "BACnet Error":
-      	Passed: 64275
-      	Failed: 0
-      Test "BACnet Strings":
-      	Passed: 1153
-      	Failed: 0
-      Test "BACnet Binary Input":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet Binary Output":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet Binary_Value":
-      	Passed: 4
-      	Failed: 0
-      Test "crc":
-      	Passed: 13
-      	Failed: 0
-      Test "BACnet Device":
-      	Passed: 12
-      	Failed: 0
-      Test "BACnet I-Am":
-      	Passed: 6
-      	Fa</value>
+                                      <value dataType="string" bitLength="3520" encoding="ASCII">ion Data":
+                                        Passed: 66
+                                        Failed: 0
+                                        Test "BACDCode":
+                                        Passed: 12617539
+                                        Failed: 0
+                                        Test "BACnet Error":
+                                        Passed: 64275
+                                        Failed: 0
+                                        Test "BACnet Strings":
+                                        Passed: 1153
+                                        Failed: 0
+                                        Test "BACnet Binary Input":
+                                        Passed: 4
+                                        Failed: 0
+                                        Test "BACnet Binary Output":
+                                        Passed: 4
+                                        Failed: 0
+                                        Test "BACnet Binary_Value":
+                                        Passed: 4
+                                        Failed: 0
+                                        Test "crc":
+                                        Passed: 13
+                                        Failed: 0
+                                        Test "BACnet Device":
+                                        Passed: 12
+                                        Failed: 0
+                                        Test "BACnet I-Am":
+                                        Passed: 6
+                                        Fa</value>
                                     </BACnetApplicationTagOctetString>
                                   </BACnetApplicationTag>
                                 </fileData>
@@ -6940,33 +6942,33 @@
                                       </BACnetTagHeader>
                                     </header>
                                     <BACnetApplicationTagOctetString>
-                                      <value dataType="string" bitLength="3520" encoding="UTF-8">iled: 0
-      Test "BACnet I-Have":
-      	Passed: 3469312
-      	Failed: 0
-      Test "index text":
-      	Passed: 25
-      	Failed: 0
-      Test "BACnet Life Safety Point":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet Multi-state Output":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet NPDU":
-      	Passed: 27
-      	Failed: 0
-      Test "BACnet ReinitializeDevice":
-      	Passed: 5
-      	Failed: 0
-      Test "BACnet Reject":
-      	Passed: 260107
-      	Failed: 0
-      Test "ringbuf":
-      	Passed: 769
-      	Failed: 0
-      Test "BACnet ReadProperty":
-      	Passed: 17</value>
+                                      <value dataType="string" bitLength="3520" encoding="ASCII">iled: 0
+                                        Test "BACnet I-Have":
+                                        Passed: 3469312
+                                        Failed: 0
+                                        Test "index text":
+                                        Passed: 25
+                                        Failed: 0
+                                        Test "BACnet Life Safety Point":
+                                        Passed: 4
+                                        Failed: 0
+                                        Test "BACnet Multi-state Output":
+                                        Passed: 4
+                                        Failed: 0
+                                        Test "BACnet NPDU":
+                                        Passed: 27
+                                        Failed: 0
+                                        Test "BACnet ReinitializeDevice":
+                                        Passed: 5
+                                        Failed: 0
+                                        Test "BACnet Reject":
+                                        Passed: 260107
+                                        Failed: 0
+                                        Test "ringbuf":
+                                        Passed: 769
+                                        Failed: 0
+                                        Test "BACnet ReadProperty":
+                                        Passed: 17</value>
                                     </BACnetApplicationTagOctetString>
                                   </BACnetApplicationTag>
                                 </fileData>
@@ -7213,22 +7215,22 @@
                                       </BACnetTagHeader>
                                     </header>
                                     <BACnetApplicationTagOctetString>
-                                      <value dataType="string" bitLength="2112" encoding="UTF-8">Failed: 0
-      Test "BACnet ReadPropertyMultiple":
-      	Passed: 73
-      	Failed: 0
-      Test "static buffer":
-      	Passed: 22
-      	Failed: 0
-      Test "BACnet Who-Is":
-      	Passed: 104
-      	Failed: 0
-      Test "BACnet Who-Has":
-      	Passed: 3942557
-      	Failed: 0
-      Test "BACnet WriteProperty":
-      	Passed: 183
-      	Failed: 0</value>
+                                      <value dataType="string" bitLength="2112" encoding="ASCII">Failed: 0
+                                        Test "BACnet ReadPropertyMultiple":
+                                        Passed: 73
+                                        Failed: 0
+                                        Test "static buffer":
+                                        Passed: 22
+                                        Failed: 0
+                                        Test "BACnet Who-Is":
+                                        Passed: 104
+                                        Failed: 0
+                                        Test "BACnet Who-Has":
+                                        Passed: 3942557
+                                        Failed: 0
+                                        Test "BACnet WriteProperty":
+                                        Passed: 183
+                                        Failed: 0</value>
                                     </BACnetApplicationTagOctetString>
                                   </BACnetApplicationTag>
                                 </fileData>
@@ -9345,31 +9347,31 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3520" encoding="UTF-8">Test "BACnet Abort":
-      	Passed: 260107
-      	Failed: 0
-      Test "BACnet Address":
-      	Passed: 2805
-      	Failed: 0
-      Test "BACnet DeviceCommunicationControl":
-      	Passed: 12
-      	Failed: 0
-      Test "BACnet Analog Input":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet Analog Output":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet Analog Value":
-      	Passed: 4
-      	Failed: 0
-      Test "BACnet AtomicReadFile":
-      	Passed: 29
-      	Failed: 0
-      Test "BACnet AtomicWriteFile":
-      	Passed: 25
-      	Failed: 0
-      Test "BACnet Applicat</value>
+                                <value dataType="string" bitLength="3520" encoding="ASCII">Test "BACnet Abort":
+                                  Passed: 260107
+                                  Failed: 0
+                                  Test "BACnet Address":
+                                  Passed: 2805
+                                  Failed: 0
+                                  Test "BACnet DeviceCommunicationControl":
+                                  Passed: 12
+                                  Failed: 0
+                                  Test "BACnet Analog Input":
+                                  Passed: 4
+                                  Failed: 0
+                                  Test "BACnet Analog Output":
+                                  Passed: 4
+                                  Failed: 0
+                                  Test "BACnet Analog Value":
+                                  Passed: 4
+                                  Failed: 0
+                                  Test "BACnet AtomicReadFile":
+                                  Passed: 29
+                                  Failed: 0
+                                  Test "BACnet AtomicWriteFile":
+                                  Passed: 25
+                                  Failed: 0
+                                  Test "BACnet Applicat</value>
                               </BACnetApplicationTagOctetString>
                             </BACnetApplicationTag>
                           </fileData>
@@ -9635,4 +9637,4 @@
     </xml>
   </testcase>
 
-</test:testsuite>
\ No newline at end of file
+</test:testsuite>
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/FieldCommons.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/FieldCommons.java
index 5225f60..a575e1d 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/FieldCommons.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/FieldCommons.java
@@ -27,15 +27,15 @@ import java.util.stream.Stream;
 
 public interface FieldCommons {
 
-    default Optional<ByteOrder> extractByteOder(WithReaderArgs... readerArgs) {
-        return extractByteOder(Stream.of(readerArgs).map(WithReaderWriterArgs.class::cast).toArray(WithReaderWriterArgs[]::new));
+    default Optional<ByteOrder> extractByteOrder(WithReaderArgs... readerArgs) {
+        return extractByteOrder(Stream.of(readerArgs).map(WithReaderWriterArgs.class::cast).toArray(WithReaderWriterArgs[]::new));
     }
 
-    default Optional<ByteOrder> extractByteOder(WithWriterArgs... writerArgs) {
-        return extractByteOder(Stream.of(writerArgs).map(WithReaderWriterArgs.class::cast).toArray(WithReaderWriterArgs[]::new));
+    default Optional<ByteOrder> extractByteOrder(WithWriterArgs... writerArgs) {
+        return extractByteOrder(Stream.of(writerArgs).map(WithReaderWriterArgs.class::cast).toArray(WithReaderWriterArgs[]::new));
     }
 
-    default Optional<ByteOrder> extractByteOder(WithReaderWriterArgs... readerWriterArgs) {
+    default Optional<ByteOrder> extractByteOrder(WithReaderWriterArgs... readerWriterArgs) {
         for (WithReaderWriterArgs arg : readerWriterArgs) {
             if (arg instanceof withOptionByteOrder) {
                 return Optional.of(((withOptionByteOrder) arg).byteOrder());
@@ -44,6 +44,23 @@ public interface FieldCommons {
         return Optional.empty();
     }
 
+    default Optional<String> extractEncoding(WithReaderArgs... readerArgs) {
+        return extractEncoding(Stream.of(readerArgs).map(WithReaderWriterArgs.class::cast).toArray(WithReaderWriterArgs[]::new));
+    }
+
+    default Optional<String> extractEncoding(WithWriterArgs... writerArgs) {
+        return extractEncoding(Stream.of(writerArgs).map(WithReaderWriterArgs.class::cast).toArray(WithReaderWriterArgs[]::new));
+    }
+
+    default Optional<String> extractEncoding(WithReaderWriterArgs... readerWriterArgs) {
+        for (WithReaderWriterArgs arg : readerWriterArgs) {
+            if (arg instanceof withOptionEncoding) {
+                return Optional.of(((withOptionEncoding) arg).encoding());
+            }
+        }
+        return Optional.empty();
+    }
+
     default <T> T switchParseByteOrderIfNecessary(RunParseWrapped<T> runnable, ByteOrderAware byteOrderAware, ByteOrder wantedByteOrder) throws ParseException {
         Objects.requireNonNull(runnable);
         Objects.requireNonNull(byteOrderAware);
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderChecksum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderChecksum.java
index adcc98d..a1296fc 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderChecksum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderChecksum.java
@@ -33,7 +33,7 @@ public class FieldReaderChecksum<T> implements FieldCommons {
 
     public T readChecksumField(String logicalName, DataReader<T> dataReader, T referenceValue, WithReaderArgs... readerArgs) throws ParseException {
         LOGGER.debug("reading field {}", logicalName);
-        T checksumValue = switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+        T checksumValue = switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOrder(readerArgs).orElse(null));
         if (!Objects.equals(checksumValue, referenceValue)) {
             throw new ParseException("Checksum value '" + checksumValue + "' doesn't match expected '" + referenceValue + "'");
         }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderConst.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderConst.java
index 9715f30..0bc465f 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderConst.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderConst.java
@@ -33,7 +33,7 @@ public class FieldReaderConst<T> implements FieldCommons {
 
     public T readConstField(String logicalName, DataReader<T> dataReader, T expectedValue, WithReaderArgs... readerArgs) throws ParseException {
         LOGGER.debug("reading field {}", logicalName);
-        T constValue = switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+        T constValue = switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOrder(readerArgs).orElse(null));
         if (!Objects.equals(constValue, expectedValue)) {
             throw new ParseException("Actual value " + constValue + " doesn't match expected " + expectedValue + ". Byte position: " + dataReader.getPos());
         }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderDiscriminator.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderDiscriminator.java
index 2172e7f..f66a15d 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderDiscriminator.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderDiscriminator.java
@@ -31,7 +31,7 @@ public class FieldReaderDiscriminator<T> implements FieldCommons {
 
     public T readDiscriminatorField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
         LOGGER.debug("reading field {}", logicalName);
-        return switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+        return switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOrder(readerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java
index 7f59b49..d2cb921 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java
@@ -33,7 +33,7 @@ public class FieldReaderEnum<T> implements FieldCommons {
     public T readEnumField(String logicalName, String innerName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
         LOGGER.debug("reading field {}", logicalName);
         dataReader.pullContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
-        T result = switchParseByteOrderIfNecessary(() -> dataReader.read(innerName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+        T result = switchParseByteOrderIfNecessary(() -> dataReader.read(innerName, readerArgs), dataReader, extractByteOrder(readerArgs).orElse(null));
         dataReader.closeContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
         return result;
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderImplicit.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderImplicit.java
index 319d2db..5706bc1 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderImplicit.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderImplicit.java
@@ -31,7 +31,7 @@ public class FieldReaderImplicit<T> implements FieldCommons {
 
     public T readImplicitField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
         LOGGER.debug("reading field {}", logicalName);
-        return switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+        return switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOrder(readerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderManual.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderManual.java
index 8063362..292c818 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderManual.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderManual.java
@@ -19,7 +19,6 @@
 package org.apache.plc4x.java.spi.codegen.fields;
 
 import org.apache.plc4x.java.spi.codegen.FieldCommons;
-import org.apache.plc4x.java.spi.codegen.io.DataReader;
 import org.apache.plc4x.java.spi.codegen.io.ParseSupplier;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
@@ -34,7 +33,7 @@ public class FieldReaderManual<T> implements FieldCommons {
     public T readManualField(String logicalName, ReadBuffer readBuffer, ParseSupplier<T> parseFunction, WithReaderArgs... readerArgs) throws ParseException {
         LOGGER.debug("reading field {}", logicalName);
         readBuffer.pullContext(logicalName);
-        T value = switchParseByteOrderIfNecessary(parseFunction::get, readBuffer, extractByteOder(readerArgs).orElse(null));
+        T value = switchParseByteOrderIfNecessary(parseFunction::get, readBuffer, extractByteOrder(readerArgs).orElse(null));
         readBuffer.closeContext(logicalName);
         return value;
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderOptional.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderOptional.java
index f3a372e..f638968 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderOptional.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderOptional.java
@@ -39,7 +39,7 @@ public class FieldReaderOptional<T> implements FieldCommons {
 
         int curPos = dataReader.getPos();
         try {
-            T field = switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+            T field = switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOrder(readerArgs).orElse(null));
             LOGGER.debug("done reading field {}. Value: {}", logicalName, field);
             return field;
         } catch (ParseAssertException e) {
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderPeek.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderPeek.java
index 972db67..3158e57 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderPeek.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderPeek.java
@@ -34,7 +34,7 @@ public class FieldReaderPeek<T> implements FieldCommons {
         int curPos = dataReader.getPos();
         try {
             // TODO: implement offset. We either need to pass the readBuffer or add a instruction to the dataReader
-            T field = switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+            T field = switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOrder(readerArgs).orElse(null));
             LOGGER.debug("done reading field {}. Value: {}", logicalName, field);
             return field;
         } catch (ParseAssertException e) {
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderSimple.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderSimple.java
index 2737d7e..d7dcd30 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderSimple.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderSimple.java
@@ -31,7 +31,7 @@ public class FieldReaderSimple<T> implements FieldCommons {
 
     public T readSimpleField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
         LOGGER.debug("reading field {}", logicalName);
-        return switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+        return switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOrder(readerArgs).orElse(null));
     }
 
 }
\ No newline at end of file
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderTypeSwitch.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderTypeSwitch.java
index 523ef9b..e710cc6 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderTypeSwitch.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderTypeSwitch.java
@@ -31,7 +31,7 @@ public class FieldReaderTypeSwitch<T> implements FieldCommons {
 
     public T readTypeSwitchField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
         LOGGER.debug("reading field {}", logicalName);
-        return switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+        return switchParseByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOrder(readerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterArray.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterArray.java
index fcf4db2..d21dc25 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterArray.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterArray.java
@@ -47,7 +47,7 @@ public class FieldWriterArray<T> implements FieldCommons {
                 }
                 dataWriter.popContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
             }
-        }, dataWriter, extractByteOder(writerArgs).orElse(null));
+        }, dataWriter, extractByteOrder(writerArgs).orElse(null));
     }
 
     public void writeComplexTypeArrayField(String logicalName, List<? extends Message> values, WriteBuffer writeBuffer, WithWriterArgs... writerArgs) throws SerializationException {
@@ -60,7 +60,7 @@ public class FieldWriterArray<T> implements FieldCommons {
                 }
                 writeBuffer.popContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
             }
-        }, writeBuffer, extractByteOder(writerArgs).orElse(null));
+        }, writeBuffer, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterChecksum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterChecksum.java
index fab4831..d82aea4 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterChecksum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterChecksum.java
@@ -31,7 +31,7 @@ public class FieldWriterChecksum<T> implements FieldCommons {
 
     public void writeChecksumField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
-        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterConst.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterConst.java
index d13d1c8..a6dc206 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterConst.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterConst.java
@@ -31,7 +31,7 @@ public class FieldWriterConst<T> implements FieldCommons {
 
     public void writeConstField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
-        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterDiscriminator.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterDiscriminator.java
index 4233062..a4f9526 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterDiscriminator.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterDiscriminator.java
@@ -31,7 +31,7 @@ public class FieldWriterDiscriminator<T> implements FieldCommons {
 
     public void writeDiscriminatorField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
-        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterDiscriminatorEnum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterDiscriminatorEnum.java
index 29083a2..6da8284 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterDiscriminatorEnum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterDiscriminatorEnum.java
@@ -32,7 +32,7 @@ public class FieldWriterDiscriminatorEnum<T> implements FieldCommons {
     public void writeDiscriminatorEnumField(String logicalName, String innerName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
         dataWriter.pushContext(logicalName);
-        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(innerName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(innerName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
         dataWriter.popContext(logicalName);
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterEnum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterEnum.java
index 9dcb954..3cb3435 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterEnum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterEnum.java
@@ -32,7 +32,7 @@ public class FieldWriterEnum<T> implements FieldCommons {
     public void writeEnumField(String logicalName, String innerName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
         dataWriter.pushContext(logicalName);
-        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(innerName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(innerName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
         dataWriter.popContext(logicalName);
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterImplicit.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterImplicit.java
index 4c3ae84..cde71f3 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterImplicit.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterImplicit.java
@@ -31,7 +31,7 @@ public class FieldWriterImplicit<T> implements FieldCommons {
 
     public void writeImplicitField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
-        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterManual.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterManual.java
index 5e5597c..e1cd56e 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterManual.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterManual.java
@@ -31,7 +31,7 @@ public class FieldWriterManual<T> implements FieldCommons {
 
     public void writeManualField(String logicalName, RunSerializeWrapped consumer, WriteBuffer writeBuffer, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
-        switchSerializeByteOrderIfNecessary(consumer, writeBuffer, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(consumer, writeBuffer, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterManualArray.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterManualArray.java
index a15a5e6..3eed92a 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterManualArray.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterManualArray.java
@@ -39,7 +39,7 @@ public class FieldWriterManualArray<T> implements FieldCommons {
                 }
                 writeBuffer.popContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
             }
-        }, writeBuffer, extractByteOder(writerArgs).orElse(null));
+        }, writeBuffer, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterOptional.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterOptional.java
index 1346b9c..0603c24 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterOptional.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterOptional.java
@@ -32,7 +32,7 @@ public class FieldWriterOptional<T> implements FieldCommons {
     public void writeOptionalField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
         if (value != null) {
-            switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+            switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
         }
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterOptionalEnum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterOptionalEnum.java
index 41e74d5..5f6ca78 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterOptionalEnum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterOptionalEnum.java
@@ -33,7 +33,7 @@ public class FieldWriterOptionalEnum<T> implements FieldCommons {
         LOGGER.debug("write field {}", logicalName);
         dataWriter.pushContext(logicalName);
         if(value != null) {
-            switchSerializeByteOrderIfNecessary(() -> dataWriter.write(innerName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+            switchSerializeByteOrderIfNecessary(() -> dataWriter.write(innerName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
         }
         dataWriter.popContext(logicalName);
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterPadding.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterPadding.java
index f0da244..8283934 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterPadding.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterPadding.java
@@ -38,7 +38,7 @@ public class FieldWriterPadding<T> implements FieldCommons {
                 dataWriter.write("", value, writerArgs);
             }
             dataWriter.popContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
-        }, dataWriter, extractByteOder(writerArgs).orElse(null));
+        }, dataWriter, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterReserved.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterReserved.java
index dabd8d9..e8e2e7e 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterReserved.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterReserved.java
@@ -31,7 +31,7 @@ public class FieldWriterReserved<T> implements FieldCommons {
 
     public void writeReservedField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
-        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterSimple.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterSimple.java
index db3043f..1acd060 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterSimple.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterSimple.java
@@ -31,7 +31,7 @@ public class FieldWriterSimple<T> implements FieldCommons {
 
     public void writeSimpleField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
-        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(logicalName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterSimpleEnum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterSimpleEnum.java
index 9fa5a73..f248da0 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterSimpleEnum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterSimpleEnum.java
@@ -32,7 +32,7 @@ public class FieldWriterSimpleEnum<T> implements FieldCommons {
     public void writeSimpleEnumField(String logicalName, String innerName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         LOGGER.debug("write field {}", logicalName);
         dataWriter.pushContext(logicalName);
-        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(innerName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(innerName, value, writerArgs), dataWriter, extractByteOrder(writerArgs).orElse(null));
         dataWriter.popContext(logicalName);
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleBase.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleBase.java
index e8bb16c..d7fc275 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleBase.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleBase.java
@@ -18,11 +18,12 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
+import org.apache.plc4x.java.spi.codegen.FieldCommons;
 import org.apache.plc4x.java.spi.generation.ByteOrder;
 import org.apache.plc4x.java.spi.generation.WithWriterArgs;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
-public abstract class DataWriterSimpleBase<T> implements DataWriter<T> {
+public abstract class DataWriterSimpleBase<T> implements DataWriter<T>, FieldCommons {
 
     protected final WriteBuffer writeBuffer;
     protected final int bitLength;
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleString.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleString.java
index 2e2e63c..6deb722 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleString.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleString.java
@@ -18,6 +18,7 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
+import org.apache.plc4x.java.spi.codegen.FieldCommons;
 import org.apache.plc4x.java.spi.generation.SerializationException;
 import org.apache.plc4x.java.spi.generation.WithWriterArgs;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
@@ -30,7 +31,8 @@ public class DataWriterSimpleString extends DataWriterSimpleBase<String> {
 
     @Override
     public void write(String logicalName, String value, WithWriterArgs... writerArgs) throws SerializationException {
-        writeBuffer.writeString(logicalName, bitLength,"UTF-8", value, writerArgs);
+        String encoding = extractEncoding(writerArgs).orElse("UTF-8");
+        writeBuffer.writeString(logicalName, bitLength, encoding, value, writerArgs);
     }
 
 }
diff --git a/protocols/bacnetip/src/test/resources/protocols/bacnet/ParserSerializerTestsuite.xml b/protocols/bacnetip/src/test/resources/protocols/bacnet/ParserSerializerTestsuite.xml
index dd2c9e0..a69e8a6 100644
--- a/protocols/bacnetip/src/test/resources/protocols/bacnet/ParserSerializerTestsuite.xml
+++ b/protocols/bacnetip/src/test/resources/protocols/bacnet/ParserSerializerTestsuite.xml
@@ -25,7 +25,9 @@
 
   <testcase>
     <name>1	Simple-ACK      acknowledgeAlarm[  2] </name>
-    <raw>810a000b10072c0200003d</raw>
+    <!-- TODO: original pcap contains bytes at the end which will be just ignored so we remove them here. A reserved part is 12 instead of 0-->
+    <!--raw>810a000b10072c0200003d</raw-->
+    <raw>810a00091007200200</raw>
     <root-type>BVLC</root-type>
     <xml>
       <BVLC>
@@ -125,7 +127,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetContextTagOctetString>
-                                <value dataType="string" bitLength="64" encoding="UTF-8">SYNERGY</value>
+                                <value dataType="string" bitLength="64" encoding="ASCII">SYNERGY</value>
                               </BACnetContextTagOctetString>
                             </BACnetContextTag>
                           </objectName>
@@ -852,7 +854,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">#!/bin/sh
+                                <value dataType="string" bitLength="3584" encoding="ASCII">#!/bin/sh
       # Unit tests builder / runner for this project
       
       rm test.log
@@ -1095,7 +1097,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">.mak clean
+                                <value dataType="string" bitLength="3584" encoding="ASCII">.mak clean
       make -f demo/object/ai.mak
       ./analog_input &gt;&gt; test.log
       make -f demo/object/ai.mak clean
@@ -1332,7 +1334,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">clean
+                                <value dataType="string" bitLength="3584" encoding="ASCII">clean
       make -f awf.mak
       ./atomicwritefile &gt;&gt; test.log
       make -f awf.mak clean
@@ -1572,7 +1574,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">clean
+                                <value dataType="string" bitLength="3584" encoding="ASCII">clean
       
       make -f demo/object/bi.mak clean
       make -f demo/object/bi.mak
@@ -1809,7 +1811,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">make -f demo/object/device.mak clean
+                                <value dataType="string" bitLength="3584" encoding="ASCII">make -f demo/object/device.mak clean
       make -f demo/object/device.mak
       ./device &gt;&gt; test.log
       make -f demo/object/device.mak clean
@@ -2047,7 +2049,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">mak
+                                <value dataType="string" bitLength="3584" encoding="ASCII">mak
       ./lsp &gt;&gt; test.log
       make -f demo/object/lsp.mak clean
       
@@ -2288,7 +2290,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3584" encoding="UTF-8">-f reject.mak clean
+                                <value dataType="string" bitLength="3584" encoding="ASCII">-f reject.mak clean
       make -f reject.mak
       ./reject &gt;&gt; test.log
       make -f reject.mak clean
@@ -2530,7 +2532,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="2584" encoding="UTF-8">an
+                                <value dataType="string" bitLength="2584" encoding="ASCII">an
       make -f tsm.mak
       ./tsm &gt;&gt; test.log
       make -f tsm.mak clean
@@ -6393,7 +6395,7 @@
                                       </BACnetTagHeader>
                                     </header>
                                     <BACnetApplicationTagOctetString>
-                                      <value dataType="string" bitLength="3520" encoding="UTF-8">Test "BACnet Abort":
+                                      <value dataType="string" bitLength="3520" encoding="ASCII">Test "BACnet Abort":
       	Passed: 260107
       	Failed: 0
       Test "BACnet Address":
@@ -6664,7 +6666,7 @@
                                       </BACnetTagHeader>
                                     </header>
                                     <BACnetApplicationTagOctetString>
-                                      <value dataType="string" bitLength="3520" encoding="UTF-8">ion Data":
+                                      <value dataType="string" bitLength="3520" encoding="ASCII">ion Data":
       	Passed: 66
       	Failed: 0
       Test "BACDCode":
@@ -6940,7 +6942,7 @@
                                       </BACnetTagHeader>
                                     </header>
                                     <BACnetApplicationTagOctetString>
-                                      <value dataType="string" bitLength="3520" encoding="UTF-8">iled: 0
+                                      <value dataType="string" bitLength="3520" encoding="ASCII">iled: 0
       Test "BACnet I-Have":
       	Passed: 3469312
       	Failed: 0
@@ -7213,7 +7215,7 @@
                                       </BACnetTagHeader>
                                     </header>
                                     <BACnetApplicationTagOctetString>
-                                      <value dataType="string" bitLength="2112" encoding="UTF-8">Failed: 0
+                                      <value dataType="string" bitLength="2112" encoding="ASCII">Failed: 0
       Test "BACnet ReadPropertyMultiple":
       	Passed: 73
       	Failed: 0
@@ -9345,7 +9347,7 @@
                                 </BACnetTagHeader>
                               </header>
                               <BACnetApplicationTagOctetString>
-                                <value dataType="string" bitLength="3520" encoding="UTF-8">Test "BACnet Abort":
+                                <value dataType="string" bitLength="3520" encoding="ASCII">Test "BACnet Abort":
       	Passed: 260107
       	Failed: 0
       Test "BACnet Address":

[plc4x] 03/04: fix(plc4go): switch string reading

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit e9d1dcfb32a6e4f2e31abb1b8dc1865b379c95c0
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Jan 24 14:01:26 2022 +0100

    fix(plc4go): switch string reading
---
 plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go b/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go
index f0d1510..b32998a 100644
--- a/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go
+++ b/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go
@@ -378,11 +378,11 @@ func (rb *byteReadBuffer) ReadBigFloat(logicalName string, bitLength uint8, _ ..
 }
 
 func (rb *byteReadBuffer) ReadString(logicalName string, bitLength uint32, _ ...WithReaderArgs) (string, error) {
-	bigInt, err := rb.ReadBigInt(logicalName, uint64(bitLength))
+	stringBytes, err := rb.ReadByteArray(logicalName, int(bitLength/8))
 	if err != nil {
 		return "", errors.Wrap(err, "Error reading big int")
 	}
-	return string(bigInt.Bytes()), nil
+	return string(stringBytes), nil
 }
 
 func (rb *byteReadBuffer) CloseContext(_ string, _ ...WithReaderArgs) error {

[plc4x] 02/04: fix(plc4go/codgen): added missing validation field

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 5aa4e72001838ba1969154a72cbb9b4c21a571c9
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Jan 24 13:47:19 2022 +0100

    fix(plc4go/codgen): added missing validation field
---
 .../src/main/resources/templates/go/model-template.go.ftlh | 10 ++++++++++
 .../bacnetip/readwrite/model/BACnetApplicationTag.go       |  7 +++++++
 .../plc4go/bacnetip/readwrite/model/BACnetClosingTag.go    |  7 +++++++
 .../readwrite/model/BACnetConstructedDataElement.go        |  7 +++++++
 .../plc4go/bacnetip/readwrite/model/BACnetContextTag.go    | 14 ++++++++++++++
 .../bacnetip/readwrite/model/BACnetContextTagBitString.go  |  7 +++++++
 .../bacnetip/readwrite/model/BACnetContextTagBoolean.go    |  7 +++++++
 .../readwrite/model/BACnetContextTagCharacterString.go     |  7 +++++++
 .../bacnetip/readwrite/model/BACnetContextTagDate.go       |  7 +++++++
 .../readwrite/model/BACnetContextTagDeviceState.go         |  7 +++++++
 .../bacnetip/readwrite/model/BACnetContextTagDouble.go     |  7 +++++++
 .../bacnetip/readwrite/model/BACnetContextTagEnumerated.go |  7 +++++++
 .../bacnetip/readwrite/model/BACnetContextTagEventState.go |  7 +++++++
 .../bacnetip/readwrite/model/BACnetContextTagEventType.go  |  7 +++++++
 .../bacnetip/readwrite/model/BACnetContextTagNotifyType.go |  7 +++++++
 .../readwrite/model/BACnetContextTagObjectIdentifier.go    |  7 +++++++
 .../readwrite/model/BACnetContextTagOctetString.go         |  7 +++++++
 .../readwrite/model/BACnetContextTagPropertyIdentifier.go  |  7 +++++++
 .../bacnetip/readwrite/model/BACnetContextTagReal.go       |  7 +++++++
 .../readwrite/model/BACnetContextTagSignedInteger.go       |  7 +++++++
 .../bacnetip/readwrite/model/BACnetContextTagTime.go       |  7 +++++++
 .../readwrite/model/BACnetContextTagUnsignedInteger.go     |  7 +++++++
 .../plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go    |  7 +++++++
 .../plc4go/spi/testutils/ParserSerializerTestRunner.go     |  5 ++++-
 plc4go/internal/plc4go/spi/utils/Utils.go                  |  1 +
 25 files changed, 176 insertions(+), 1 deletion(-)

diff --git a/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh b/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh
index b571cb6..03f565e 100644
--- a/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh
+++ b/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh
@@ -1255,6 +1255,16 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
 	_${virtualField.name} := ${helper.toParseExpression(virtualField, virtualField.type, virtualField.valueExpression, parserArguments)}
 	${virtualField.name} := ${helper.getLanguageTypeNameForTypeReference(virtualField.type)}(_${virtualField.name})
 				<#break>
+            <#case "validation">
+                <#assign validationField = field.asValidationField().orElseThrow()>
+
+	// Validation
+	if (!(${helper.toParseExpression(validationField, helper.boolTypeReference, validationField.getValidationExpression(), null)})) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New(${validationField.getDescription().orElse("Validation failed")}) //TODO: add emit import here
+	}
+                <#break>
             <#case "peek">
                 <#assign peekField = field.asPeekField().orElseThrow()>
 
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go
index 2f816f7..6ed0979 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go
@@ -118,6 +118,13 @@ func BACnetApplicationTagParse(readBuffer utils.ReadBuffer) (*BACnetApplicationT
 		return nil, closeErr
 	}
 
+	// Validation
+	if !(bool((header.TagClass) == (TagClass_APPLICATION_TAGS))) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("should be a application tag") //TODO: add emit import here
+	}
+
 	// Virtual field
 	_tagNumber := header.TagNumber
 	tagNumber := uint8(_tagNumber)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go
index 74f334d..4a7f6f0 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go
@@ -98,6 +98,13 @@ func BACnetClosingTagParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8,
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(bool((actualLength) == (7))) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("closing tag should habe a value of 7") //TODO: add emit import here
+	}
+
 	if closeErr := readBuffer.CloseContext("BACnetClosingTag"); closeErr != nil {
 		return nil, closeErr
 	}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
index 5775529..4c77df2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
@@ -195,6 +195,13 @@ func BACnetConstructedDataElementParse(readBuffer utils.ReadBuffer, objectType B
 		}
 	}
 
+	// Validation
+	if !(bool(bool(isApplicationTag) || bool(isContextTag)) || bool(isConstructedData)) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("BACnetConstructedDataElement could not parse anything") //TODO: add emit import here
+	}
+
 	if closeErr := readBuffer.CloseContext("BACnetConstructedDataElement"); closeErr != nil {
 		return nil, closeErr
 	}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go
index 74c525f..fc92ae1 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go
@@ -121,6 +121,20 @@ func BACnetContextTagParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8,
 		return nil, closeErr
 	}
 
+	// Validation
+	if !(bool((header.ActualTagNumber) == (tagNumberArgument))) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("tagnumber doesn't match") //TODO: add emit import here
+	}
+
+	// Validation
+	if !(bool((header.TagClass) == (TagClass_CONTEXT_SPECIFIC_TAGS))) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("should be a context tag") //TODO: add emit import here
+	}
+
 	// Virtual field
 	_tagNumber := header.TagNumber
 	tagNumber := uint8(_tagNumber)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBitString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBitString.go
index 74f93d0..4464ea7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBitString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBitString.go
@@ -118,6 +118,13 @@ func BACnetContextTagBitStringParse(readBuffer utils.ReadBuffer, tagNumberArgume
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Simple Field (unusedBits)
 	_unusedBits, _unusedBitsErr := readBuffer.ReadUint8("unusedBits", 8)
 	if _unusedBitsErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go
index fbcd83f..2b28a3e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go
@@ -112,6 +112,13 @@ func BACnetContextTagBooleanParse(readBuffer utils.ReadBuffer, tagNumberArgument
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Simple Field (value)
 	_value, _valueErr := readBuffer.ReadUint8("value", 8)
 	if _valueErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagCharacterString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagCharacterString.go
index a372033..ae6dcb3 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagCharacterString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagCharacterString.go
@@ -113,6 +113,13 @@ func BACnetContextTagCharacterStringParse(readBuffer utils.ReadBuffer, tagNumber
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Simple Field (encoding)
 	if pullErr := readBuffer.PullContext("encoding"); pullErr != nil {
 		return nil, pullErr
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDate.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDate.go
index 1184ad1..f95367b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDate.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDate.go
@@ -159,6 +159,13 @@ func BACnetContextTagDateParse(readBuffer utils.ReadBuffer, tagNumberArgument ui
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Virtual field
 	_wildcard := 0xFF
 	wildcard := int8(_wildcard)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go
index 5d2bbd0..fc86e71 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go
@@ -104,6 +104,13 @@ func BACnetContextTagDeviceStateParse(readBuffer utils.ReadBuffer, tagNumberArgu
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Simple Field (state)
 	if pullErr := readBuffer.PullContext("state"); pullErr != nil {
 		return nil, pullErr
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go
index d140720..4b29a05 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go
@@ -104,6 +104,13 @@ func BACnetContextTagDoubleParse(readBuffer utils.ReadBuffer, tagNumberArgument
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Simple Field (value)
 	_value, _valueErr := readBuffer.ReadFloat64("value", 64)
 	if _valueErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEnumerated.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEnumerated.go
index db2b136..222c0f6 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEnumerated.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEnumerated.go
@@ -106,6 +106,13 @@ func BACnetContextTagEnumeratedParse(readBuffer utils.ReadBuffer, tagNumberArgum
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Array field (data)
 	if pullErr := readBuffer.PullContext("data", utils.WithRenderAsList(true)); pullErr != nil {
 		return nil, pullErr
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go
index de224c0..981de12 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go
@@ -113,6 +113,13 @@ func BACnetContextTagEventStateParse(readBuffer utils.ReadBuffer, tagNumberArgum
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Manual Field (eventState)
 	eventState, _eventStateErr := ReadEventState(readBuffer, actualLength)
 	if _eventStateErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go
index eb92359..1b31844 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go
@@ -113,6 +113,13 @@ func BACnetContextTagEventTypeParse(readBuffer utils.ReadBuffer, tagNumberArgume
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Manual Field (eventType)
 	eventType, _eventTypeErr := ReadEventType(readBuffer, actualLength)
 	if _eventTypeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go
index ae4d97e..9492c52 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go
@@ -104,6 +104,13 @@ func BACnetContextTagNotifyTypeParse(readBuffer utils.ReadBuffer, tagNumberArgum
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Simple Field (value)
 	if pullErr := readBuffer.PullContext("value"); pullErr != nil {
 		return nil, pullErr
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagObjectIdentifier.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagObjectIdentifier.go
index b87603d..9c21056 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagObjectIdentifier.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagObjectIdentifier.go
@@ -118,6 +118,13 @@ func BACnetContextTagObjectIdentifierParse(readBuffer utils.ReadBuffer, tagNumbe
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Manual Field (objectType)
 	objectType, _objectTypeErr := ReadObjectType(readBuffer)
 	if _objectTypeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go
index 4121ac5..b4aec97 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go
@@ -108,6 +108,13 @@ func BACnetContextTagOctetStringParse(readBuffer utils.ReadBuffer, tagNumberArgu
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Virtual field
 	_actualLengthInBit := uint16(actualLength) * uint16(uint16(8))
 	actualLengthInBit := uint16(_actualLengthInBit)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagPropertyIdentifier.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagPropertyIdentifier.go
index 8d64a58..daa600d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagPropertyIdentifier.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagPropertyIdentifier.go
@@ -113,6 +113,13 @@ func BACnetContextTagPropertyIdentifierParse(readBuffer utils.ReadBuffer, tagNum
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Manual Field (propertyIdentifier)
 	propertyIdentifier, _propertyIdentifierErr := ReadPropertyIdentifier(readBuffer, actualLength)
 	if _propertyIdentifierErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go
index b84f1a7..945f345 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go
@@ -104,6 +104,13 @@ func BACnetContextTagRealParse(readBuffer utils.ReadBuffer, tagNumberArgument ui
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Simple Field (value)
 	_value, _valueErr := readBuffer.ReadFloat32("value", 32)
 	if _valueErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagSignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagSignedInteger.go
index 46a32ce..cbc0574 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagSignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagSignedInteger.go
@@ -191,6 +191,13 @@ func BACnetContextTagSignedIntegerParse(readBuffer utils.ReadBuffer, tagNumberAr
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Virtual field
 	_isInt8 := bool((actualLength) == (1))
 	isInt8 := bool(_isInt8)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagTime.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagTime.go
index d6bfa5f..57b3d95 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagTime.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagTime.go
@@ -139,6 +139,13 @@ func BACnetContextTagTimeParse(readBuffer utils.ReadBuffer, tagNumberArgument ui
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Virtual field
 	_wildcard := 0xFF
 	wildcard := int8(_wildcard)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagUnsignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagUnsignedInteger.go
index c7abd83..8876793 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagUnsignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagUnsignedInteger.go
@@ -147,6 +147,13 @@ func BACnetContextTagUnsignedIntegerParse(readBuffer utils.ReadBuffer, tagNumber
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(isNotOpeningOrClosingTag) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("length 6 and 7 reserved for opening and closing tag") //TODO: add emit import here
+	}
+
 	// Virtual field
 	_isUint8 := bool((actualLength) == (1))
 	isUint8 := bool(_isUint8)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go
index db31653..b833ed1 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go
@@ -98,6 +98,13 @@ func BACnetOpeningTagParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8,
 		return nil, pullErr
 	}
 
+	// Validation
+	if !(bool((actualLength) == (6))) {
+		return nil, utils.ParseAssertError
+		// TODO: message would be helpful but then we need to change ParserAssertError to be customizable
+		//return nil, errors.New("opening tag should habe a value of 6") //TODO: add emit import here
+	}
+
 	if closeErr := readBuffer.CloseContext("BACnetOpeningTag"); closeErr != nil {
 		return nil, closeErr
 	}
diff --git a/plc4go/internal/plc4go/spi/testutils/ParserSerializerTestRunner.go b/plc4go/internal/plc4go/spi/testutils/ParserSerializerTestRunner.go
index d6101c5..f5c5718 100644
--- a/plc4go/internal/plc4go/spi/testutils/ParserSerializerTestRunner.go
+++ b/plc4go/internal/plc4go/spi/testutils/ParserSerializerTestRunner.go
@@ -25,6 +25,7 @@ import (
 	"fmt"
 	abethModel "github.com/apache/plc4x/plc4go/internal/plc4go/abeth/readwrite"
 	adsModel "github.com/apache/plc4x/plc4go/internal/plc4go/ads/readwrite"
+	bacnetModel "github.com/apache/plc4x/plc4go/internal/plc4go/bacnetip/readwrite"
 	df1Model "github.com/apache/plc4x/plc4go/internal/plc4go/df1/readwrite"
 	eipModel "github.com/apache/plc4x/plc4go/internal/plc4go/eip/readwrite"
 	firmataModel "github.com/apache/plc4x/plc4go/internal/plc4go/firmata/readwrite"
@@ -138,6 +139,8 @@ func RunParserSerializerTestsuite(t *testing.T, testPath string, skippedTestCase
 					helper = new(abethModel.AbethParserHelper)
 				case "ads":
 					helper = new(adsModel.AdsParserHelper)
+				case "bacnetip":
+					helper = new(bacnetModel.BacnetipParserHelper)
 				case "df1":
 					helper = new(df1Model.Df1ParserHelper)
 				case "eip":
@@ -151,7 +154,7 @@ func RunParserSerializerTestsuite(t *testing.T, testPath string, skippedTestCase
 				case "knxnetip":
 					helper = new(knxModel.KnxnetipParserHelper)
 				default:
-					t.Errorf("Testsuite %s has not mapped parser", testsuiteName)
+					t.Errorf("Testsuite %s has not mapped parser for %s", testsuiteName, protocolName)
 					return
 				}
 				_ = outputFlavor
diff --git a/plc4go/internal/plc4go/spi/utils/Utils.go b/plc4go/internal/plc4go/spi/utils/Utils.go
index c9c16dd..d8c2e0a 100644
--- a/plc4go/internal/plc4go/spi/utils/Utils.go
+++ b/plc4go/internal/plc4go/spi/utils/Utils.go
@@ -30,4 +30,5 @@ func InlineIf(test bool, a func() interface{}, b func() interface{}) interface{}
 	}
 }
 
+// TODO: make a error witch can be checked with errors.With
 var ParseAssertError = errors.New("Wrong assertion")

[plc4x] 04/04: fix(plc4go): adjusted xml writing

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 5a05613d9c1a89ab9f63969a5dc7aacc7ac23644
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Jan 24 16:45:33 2022 +0100

    fix(plc4go): adjusted xml writing
---
 .../bacnetip/readwrite/model/StaticHelper.go       |  4 +--
 .../spi/testutils/ParserSerializerTestRunner.go    | 10 +++----
 .../plc4go/spi/utils/WriteBufferXmlBased.go        | 32 ++++++++++++++++++++--
 3 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
index 3770ceb..9ce5dbd 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
@@ -231,7 +231,7 @@ func ReadProprietaryEventType(readBuffer utils.ReadBuffer, value BACnetEventType
 	return readBuffer.ReadUint32("proprietaryEventType", bitsToRead)
 }
 func ReadObjectType(readBuffer utils.ReadBuffer) (BACnetObjectType, error) {
-	readValue, err := readBuffer.ReadUint16("ObjectType", 10)
+	readValue, err := readBuffer.ReadUint16("objectType", 10)
 	if err != nil {
 		return 0, err
 	}
@@ -239,7 +239,7 @@ func ReadObjectType(readBuffer utils.ReadBuffer) (BACnetObjectType, error) {
 }
 
 func WriteObjectType(writeBuffer utils.WriteBuffer, value BACnetObjectType) error {
-	return writeBuffer.WriteUint16("ObjectType", 10, uint16(value), utils.WithAdditionalStringRepresentation(value.name()))
+	return writeBuffer.WriteUint16("objectType", 10, uint16(value), utils.WithAdditionalStringRepresentation(value.name()))
 }
 
 func WriteProprietaryObjectType(writeBuffer utils.WriteBuffer, baCnetObjectType BACnetObjectType, value uint16) error {
diff --git a/plc4go/internal/plc4go/spi/testutils/ParserSerializerTestRunner.go b/plc4go/internal/plc4go/spi/testutils/ParserSerializerTestRunner.go
index f5c5718..2739c00 100644
--- a/plc4go/internal/plc4go/spi/testutils/ParserSerializerTestRunner.go
+++ b/plc4go/internal/plc4go/spi/testutils/ParserSerializerTestRunner.go
@@ -34,6 +34,7 @@ import (
 	s7Model "github.com/apache/plc4x/plc4go/internal/plc4go/s7/readwrite"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/rs/zerolog/log"
+	"github.com/stretchr/testify/assert"
 	"github.com/subchen/go-xmldom"
 	"os"
 	"strconv"
@@ -115,7 +116,7 @@ func RunParserSerializerTestsuite(t *testing.T, testPath string, skippedTestCase
 				}
 				referenceXml := child.FindOneByName("xml")
 				normalizeXml(referenceXml)
-				referenceSerialized := referenceXml.FirstChild().XML()
+				referenceSerialized := referenceXml.FirstChild().XMLPretty()
 
 				// Get the raw input by decoding the hex-encoded binary input
 				rawInput, err := hex.DecodeString(rawInputText)
@@ -166,13 +167,11 @@ func RunParserSerializerTestsuite(t *testing.T, testPath string, skippedTestCase
 
 				{
 					// First try to use the native xml writer
-					var err error
 					serializable := msg.(utils.Serializable)
 					buffer := utils.NewXmlWriteBuffer()
-					if err = serializable.Serialize(buffer); err == nil {
+					if err := serializable.Serialize(buffer); err == nil {
 						actualXml := buffer.GetXmlString()
-						err = CompareResults([]byte(actualXml), []byte(referenceSerialized))
-						if err != nil {
+						if err := CompareResults([]byte(actualXml), []byte(referenceSerialized)); err != nil {
 							border := strings.Repeat("=", 100)
 							fmt.Printf(
 								"\n"+
@@ -198,6 +197,7 @@ func RunParserSerializerTestsuite(t *testing.T, testPath string, skippedTestCase
 								actualXml,
 								err,
 								testCaseName)
+							assert.Equal(t, referenceSerialized, actualXml)
 							t.Error("Error comparing the results: " + err.Error())
 							return
 						}
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go b/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go
index 294fc8b..0ec47f4 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go
@@ -24,6 +24,7 @@ import (
 	"fmt"
 	"math/big"
 	"strings"
+	"unicode"
 )
 
 type WriteBufferXmlBased interface {
@@ -152,13 +153,40 @@ func (x *xmlWriteBuffer) WriteBigFloat(logicalName string, bitLength uint8, valu
 	return x.encodeElement(logicalName, value, x.generateAttr(rwFloatKey, uint(bitLength), writerArgs...), writerArgs...)
 }
 
+//[^\u0009\r\n\u0020-\uD7FF\uE000-\uFFFD\ud800\udc00-\udbff\udfff]
+var printableRange = &unicode.RangeTable{
+	R16: []unicode.Range16{
+		{0x0009, 0x0009, 1},
+		{0x000D, 0x000D, 1},
+		{0x000A, 0x000A, 1},
+		{0x0020, 0xD7FF, 1},
+		{0xE000, 0xFFFD, 1},
+		{0xD800, 0xD800, 1},
+		{0xDC00, 0xDBFF, 1},
+		{0xDFFF, 0xDFFF, 1},
+	},
+}
+
 func (x *xmlWriteBuffer) WriteString(logicalName string, bitLength uint32, encoding string, value string, writerArgs ...WithWriterArgs) error {
 	attr := x.generateAttr(rwStringKey, uint(bitLength), writerArgs...)
 	attr = append(attr, xml.Attr{Name: xml.Name{Local: rwEncodingKey}, Value: encoding})
-	return x.encodeElement(logicalName, value, attr, writerArgs...)
+	var valueToBeWritten interface{}
+	cleanedUpString := strings.TrimFunc(value, func(r rune) bool {
+		return !unicode.In(r, printableRange)
+	})
+	cleanedUpString = value
+	valueToBeWritten = cleanedUpString
+	if strings.Contains(cleanedUpString, "\n") {
+		valueToBeWritten = struct {
+			S string `xml:",innerxml"`
+		}{
+			S: "<![CDATA[" + cleanedUpString + "]]>",
+		}
+	}
+	return x.encodeElement(logicalName, valueToBeWritten, attr, writerArgs...)
 }
 
-func (x *xmlWriteBuffer) WriteVirtual(logicalName string, value interface{}, writerArgs ...WithWriterArgs) error {
+func (x *xmlWriteBuffer) WriteVirtual(_ string, _ interface{}, _ ...WithWriterArgs) error {
 	// NO-OP
 	return nil
 }