You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2021/10/23 16:47:00 UTC

[plc4x] branch feature/mspec-ng updated: - Fixed enums in simple fileds - Continued refactoring Array fields to Lists - Started fixing the AB-ETH and ADS driver after this change - Refactored the ADS driver to use byte[] instead of Lists of "int 8"

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

cdutz pushed a commit to branch feature/mspec-ng
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/mspec-ng by this push:
     new 41adae9  - Fixed enums in simple fileds - Continued refactoring Array fields to Lists - Started fixing the AB-ETH and ADS driver after this change - Refactored the ADS driver to use byte[] instead of Lists of "int 8"
41adae9 is described below

commit 41adae91d13f19a2171c206b9308d07a45743c8b
Author: cdutz <ch...@c-ware.de>
AuthorDate: Sat Oct 23 18:46:50 2021 +0200

    - Fixed enums in simple fileds
    - Continued refactoring Array fields to Lists
    - Started fixing the AB-ETH and ADS driver after this change
    - Refactored the ADS driver to use byte[] instead of Lists of "int 8"
---
 .../resources/templates/java/io-template.java.ftlh |  29 ++---
 .../templates/java/pojo-template.java.ftlh         |  14 +--
 .../java/abeth/protocol/AbEthProtocolLogic.java    |  34 +++---
 .../java/abeth/protocol/Plc4xAbEthProtocol.java    |  36 +++---
 .../plc4x/java/ads/protocol/AdsProtocolLogic.java  |  11 +-
 .../java/spi/codegen/fields/FieldReaderArray.java  |   9 +-
 .../java/spi/generation/ReadBufferXmlBased.java    |   3 +-
 .../resources/protocols/ads/ads-discovery.mspec    |   6 +-
 .../ads/src/main/resources/protocols/ads/ads.mspec |  14 +--
 .../resources/protocols/ads/DriverTestsuite.xml    | 131 ++-------------------
 .../protocols/ads/ParserSerializerTestsuite.xml    |  51 +-------
 11 files changed, 91 insertions(+), 247 deletions(-)

diff --git a/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
index 37cc0f6..1c294dd 100644
--- a/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
@@ -154,12 +154,12 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
             <#assign numberOfBytesExpression>
                 <#compress>
                     <#if field.isCountArrayField()>
-                        int numberOfBytes = ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
+                        int numberOfBytes = (int) ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
                     <#elseif field.isLengthArrayField()>
-                        int numberOfBytes = ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
+                        int numberOfBytes = (int) ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
                     <#elseif field.isTerminatedArrayField()>
                     <#-- TODO: we need to find out to implement this-->
-                        int numberOfBytes := ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
+                        int numberOfBytes := (int) ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
                     <#else>
                     <#-- TODO: we should throw a exception here-->
                         int numberOfBytes := -1
@@ -177,20 +177,17 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
         <#-- If this is a count array, we can directly initialize an array with the given size -->
             <#if field.isCountArrayField()>
         // Count array
-        Object ${arrayField.name}Object = readCountArrayField(${helper.getLanguageTypeNameForField(field)}.class, "${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)});
-        ${helper.getLanguageTypeNameForField(field)}[] ${arrayField.name} = (${helper.getLanguageTypeNameForField(field)}[]) ${arrayField.name}Object;
+        List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> ${arrayField.name} = readCountArrayField("${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)});
         <#-- In all other cases do we have to work with a list, that is later converted to an array -->
             <#else>
             <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
                 <#if field.isLengthArrayField()>
         // Length array
-        Object ${arrayField.name}Object = readLengthArrayField(${helper.getLanguageTypeNameForField(field)}.class, "${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)});
-        ${helper.getLanguageTypeNameForField(field)}[] ${arrayField.name} = (${helper.getLanguageTypeNameForField(field)}[]) ${arrayField.name}Object;
+        List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> ${arrayField.name} = readLengthArrayField("${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)});
             <#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
                 <#elseif field.isTerminatedArrayField()>
         // Terminated array
-        Object ${arrayField.name}Object = readTerminatedArrayField(${helper.getLanguageTypeNameForField(field)}.class, "${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, () -> ((boolean) (${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)})));
-        ${helper.getLanguageTypeNameForField(field)}[] ${arrayField.name} = (${helper.getLanguageTypeNameForField(field)}[]) ${arrayField.name}Object;
+        List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> ${arrayField.name} = readTerminatedArrayField("${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, () -> ((boolean) (${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)})));
                 </#if>
             </#if>
         </#if>
@@ -259,7 +256,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
         <#assign typedField = field.asTypedField().orElseThrow()>
         <#assign namedField = field.asNamedField().orElseThrow()>
 
-        // Enum field (${enumField.name})
+        // ${field.typeName?cap_first} field (${enumField.name})
         ${helper.getLanguageTypeNameForField(field)} ${namedField.name} = read${field.typeName?cap_first}Field("${namedField.name}", "${helper.getTypeDefinitionForTypeReference(enumField.type).name}", new DataReaderEnumDefault<>(${helper.getTypeDefinitionForTypeReference(enumField.type).name}::firstEnumForField${enumField.fieldName?cap_first}, ${helper.getDataReaderCall(helper.getEnumBaseTypeReference(enumField.type))}));
         <#break>
     <#case "implicit">
@@ -372,7 +369,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
         <#assign namedField = field.asNamedField().orElseThrow()>
 
         // ${field.typeName?cap_first} Field (${namedField.name})
-        ${helper.getLanguageTypeNameForField(field)} ${namedField.name} = read${field.typeName?cap_first}Field("${namedField.name}", ${helper.getDataReaderCall(typedField.type)});
+        ${helper.getLanguageTypeNameForField(field)} ${namedField.name} = <#if helper.isEnumTypeReference(typedField.type)>readEnumField("${namedField.name}", "${helper.getLanguageTypeNameForField(field)}", ${helper.getDataReaderCall(typedField.type)});<#else>read${field.typeName?cap_first}Field("${namedField.name}", ${helper.getDataReaderCall(typedField.type)});</#if>
         <#break>
     <#-- TODO: Port this -->
     <#case "switch">
@@ -468,7 +465,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
             writeBuffer.writeByteArray("${arrayField.name}", _value.get${arrayField.name?cap_first}());
             <#else>
             writeBuffer.pushContext("${arrayField.name}", WithReaderWriterArgs.WithRenderAsList(true));
-            int itemCount = (int) _value.get${arrayField.name?cap_first}().length;
+            int itemCount = (int) _value.get${arrayField.name?cap_first}().size();
             int curItem = 0;
             for(${helper.getLanguageTypeNameForField(arrayField)} element : _value.get${arrayField.name?cap_first}()) {
                     <#if helper.isSimpleTypeReference(arrayField.type)>
@@ -651,7 +648,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
 
 <#if type.isDiscriminatedParentTypeDefinition()>
     public static interface ${type.name}Builder {
-        ${type.name} build(<#list type.propertyFields as field>${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name}<#sep>, </#sep></#list>);
+        ${type.name} build(<#list type.propertyFields as field><#if field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name}<#sep>, </#sep></#list>);
     }
 
 </#if>
@@ -659,17 +656,17 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
     public static class ${type.name}Builder implements ${type.parentType.name}IO.${type.parentType.name}Builder {
         <#if type.propertyFields?has_content>
             <#list type.propertyFields as field>
-        private final ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name};
+        private final <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name};
             </#list>
         </#if>
 
-        public ${type.name}Builder(<#list type.propertyFields as field>${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name}<#sep>, </#sep></#list>) {
+        public ${type.name}Builder(<#list type.propertyFields as field><#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name}<#sep>, </#sep></#list>) {
             <#list type.propertyFields as field>
             this.${field.name} = ${field.name};
             </#list>
         }
 
-        public ${type.name} build(<#list type.parentType.asComplexTypeDefinition().orElseThrow().propertyFields as field>${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name}<#sep>, </#sep></#list>) {
+        public ${type.name} build(<#list type.parentType.asComplexTypeDefinition().orElseThrow().propertyFields as field><#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name}<#sep>, </#sep></#list>) {
             return new ${type.name}(<#list type.allPropertyFields as field>${field.name}<#sep>, </#sep></#list>);
         }
     }
diff --git a/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
index e34be2e..b3e66c4 100644
--- a/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
@@ -116,12 +116,12 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
 
     // Properties.
 <#list type.propertyFields as field>
-    private final ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name};
+    private final <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name};
 </#list>
 </#if>
 
     <#-- getAllPropertyFields() returns not only the property fields of this type but also of it's parents -->
-    public ${type.name}(<#list type.getAllPropertyFields() as field>${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name}<#sep>, </#sep></#list>) {
+    public ${type.name}(<#list type.getAllPropertyFields() as field><#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name}<#sep>, </#sep></#list>) {
 <#if type.getParentPropertyFields()?has_content>
         super(<#list type.getParentPropertyFields() as field>${field.name}<#sep>, </#sep></#list>);
 </#if>
@@ -131,18 +131,18 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
     }
 
 <#list type.abstractFields as field>
-    public abstract ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.asNamedField().orElseThrow().name?cap_first}();
+    public abstract <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> get${field.asNamedField().orElseThrow().name?cap_first}();
 
 </#list>
 <#list type.propertyFields as field>
-    public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}() {
+    public <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> get${field.name?cap_first}() {
         return ${field.name};
     }
 
 </#list>
 <#list type.virtualFields as field>
     <#if !type.isDiscriminatorField(field.name)>
-    public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}() {
+    public <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> get${field.name?cap_first}() {
         <#if helper.getLanguageTypeNameForField(field) = 'String'>
         return ${helper.getLanguageTypeNameForField(field)}.valueOf(${helper.toAccessExpression(field, field.valueExpression, parserArguments)});
         <#else>
@@ -175,12 +175,12 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
         if(${arrayField.name} != null) {
         <#if helper.isSimpleTypeReference(arrayField.type)>
             <#assign simpleTypeReference = arrayField.type.asSimpleTypeReference().orElseThrow()>
-            lengthInBits += ${simpleTypeReference.sizeInBits} * ${arrayField.name}.length;
+            lengthInBits += ${simpleTypeReference.sizeInBits} * ${arrayField.name}.<#if arrayField.type.isByteBased()>length<#else>size()</#if>;
         <#elseif arrayField.isCountArrayField()>
             int i=0;
             <#assign complexTypeReference = arrayField.type.asComplexTypeReference().orElseThrow()>
             for(${complexTypeReference.name} element : ${arrayField.name}) {
-                boolean last = ++i >= ${arrayField.name}.length;
+                boolean last = ++i >= ${arrayField.name}.size();
                 lengthInBits += element.getLengthInBitsConditional(last);
             }
         <#else>
diff --git a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java
index d4c7c44..6f43499 100644
--- a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java
+++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java
@@ -39,7 +39,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.time.Duration;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -49,8 +51,8 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
     private static final Logger logger = LoggerFactory.getLogger(AbEthProtocolLogic.class);
     public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000);
 
-    private static final short[] emptySenderContext = new short[] {(short) 0x00 ,(short) 0x00 ,(short) 0x00,
-        (short) 0x00,(short) 0x00,(short) 0x00, (short) 0x00,(short) 0x00};
+    private static final List<Short> emptySenderContext = Arrays.asList((short) 0x00 ,(short) 0x00 ,(short) 0x00,
+        (short) 0x00,(short) 0x00,(short) 0x00, (short) 0x00,(short) 0x00);
 
     private AbEthConfiguration configuration;
 
@@ -153,9 +155,9 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
                         case INTEGER: // output as single bytes
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
-                                short[] data = df1PTLR.getData();
-                                if(data.length == 1) {
-                                    plcValue = new PlcINT(data[0]);
+                                List<Short> data = df1PTLR.getData();
+                                if(data.size() == 1) {
+                                    plcValue = new PlcINT(data.get(0));
                                 } else {
                                     plcValue = IEC61131ValueHandler.of(data);
                                 }
@@ -164,33 +166,33 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
                         case WORD:
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
-                                short[] data = df1PTLR.getData();
-                                if (((data[1]>> 7) & 1) == 0)  {
-                                    plcValue = IEC61131ValueHandler.of((data[1] << 8) + data[0]);  // positive number
+                                List<Short> data = df1PTLR.getData();
+                                if (((data.get(1)>> 7) & 1) == 0)  {
+                                    plcValue = IEC61131ValueHandler.of((data.get(1) << 8) + data.get(0));  // positive number
                                 } else {
-                                    plcValue = IEC61131ValueHandler.of((((~data[1] & 0b01111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
+                                    plcValue = IEC61131ValueHandler.of((((~data.get(1) & 0b01111111) << 8) + (~(data.get(0)-1) & 0b11111111))  * -1);  // negative number
                                 }
                             }
                             break;
                         case DWORD:
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
-                                short[] data = df1PTLR.getData();
-                                if (((data[3]>> 7) & 1) == 0)  {
-                                    plcValue = IEC61131ValueHandler.of((data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0]);  // positive number
+                                List<Short> data = df1PTLR.getData();
+                                if (((data.get(3)>> 7) & 1) == 0)  {
+                                    plcValue = IEC61131ValueHandler.of((data.get(3) << 24) + (data.get(2) << 16) + (data.get(1) << 8) + data.get(0));  // positive number
                                 } else {
-                                    plcValue = IEC61131ValueHandler.of((((~data[3] & 0b01111111) << 24) + ((~(data[2]-1) & 0b11111111) << 16)+ ((~(data[1]-1) & 0b11111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
+                                    plcValue = IEC61131ValueHandler.of((((~data.get(3) & 0b01111111) << 24) + ((~(data.get(2)-1) & 0b11111111) << 16)+ ((~(data.get(1)-1) & 0b11111111) << 8) + (~(data.get(0)-1) & 0b11111111))  * -1);  // negative number
                                 }
                             }
                             break;
                         case SINGLEBIT:
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
-                                short[] data = df1PTLR.getData();
+                                List<Short> data = df1PTLR.getData();
                                 if (field.getBitNumber() < 8) {
-                                    plcValue = IEC61131ValueHandler.of((data[0] & (1 <<  field.getBitNumber())) != 0);         // read from first byte
+                                    plcValue = IEC61131ValueHandler.of((data.get(0) & (1 <<  field.getBitNumber())) != 0);         // read from first byte
                                 } else {
-                                    plcValue = IEC61131ValueHandler.of((data[1] & (1 << (field.getBitNumber() - 8) )) != 0);   // read from second byte
+                                    plcValue = IEC61131ValueHandler.of((data.get(1) & (1 << (field.getBitNumber() - 8) )) != 0);   // read from second byte
                                 }
                             }
                             break;
diff --git a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
index e7705cd..3541035 100644
--- a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
+++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
@@ -39,9 +39,7 @@ import org.apache.plc4x.java.spi.values.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
 @Deprecated
@@ -50,8 +48,8 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
     private static final Logger logger = LoggerFactory.getLogger(Plc4xAbEthProtocol.class);
 
     private static final AtomicInteger transactionCounterGenerator = new AtomicInteger(10);
-    private static final short[] emptySenderContext = new short[] {(short) 0x00 ,(short) 0x00 ,(short) 0x00,
-        (short) 0x00,(short) 0x00,(short) 0x00, (short) 0x00,(short) 0x00};
+    private static final List<Short> emptySenderContext = Arrays.asList((short) 0x00 ,(short) 0x00 ,(short) 0x00,
+            (short) 0x00,(short) 0x00,(short) 0x00, (short) 0x00,(short) 0x00);
 
     private long sessionHandle;
     private Map<Integer, PlcRequestContainer> requests;
@@ -176,9 +174,9 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
                         case INTEGER: // output as single bytes
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
-                                short[] data = df1PTLR.getData();
-                                if(data.length == 1) {
-                                    plcValue = new PlcINT(data[0]);
+                                List<Short> data = df1PTLR.getData();
+                                if(data.size() == 1) {
+                                    plcValue = new PlcINT(data.get(0));
                                 } else {
                                     plcValue = IEC61131ValueHandler.of(data);
                                 }
@@ -187,33 +185,33 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
                         case WORD:
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
-                                short[] data = df1PTLR.getData();
-                                if (((data[1]>> 7) & 1) == 0)  {
-                                    plcValue = IEC61131ValueHandler.of((data[1] << 8) + data[0]);  // positive number
+                                List<Short> data = df1PTLR.getData();
+                                if (((data.get(1)>> 7) & 1) == 0)  {
+                                    plcValue = IEC61131ValueHandler.of((data.get(1) << 8) + data.get(0));  // positive number
                                 } else {
-                                    plcValue = IEC61131ValueHandler.of((((~data[1] & 0b01111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
+                                    plcValue = IEC61131ValueHandler.of((((~data.get(1) & 0b01111111) << 8) + (~(data.get(0)-1) & 0b11111111))  * -1);  // negative number
                                 }
                             }
                             break;
                         case DWORD:
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
-                                short[] data = df1PTLR.getData();
-                                if (((data[3]>> 7) & 1) == 0)  {
-                                    plcValue = IEC61131ValueHandler.of((data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0]);  // positive number
+                                List<Short> data = df1PTLR.getData();
+                                if (((data.get(3)>> 7) & 1) == 0)  {
+                                    plcValue = IEC61131ValueHandler.of((data.get(3) << 24) + (data.get(2) << 16) + (data.get(1) << 8) + data.get(0));  // positive number
                                 } else {
-                                    plcValue = IEC61131ValueHandler.of((((~data[3] & 0b01111111) << 24) + ((~(data[2]-1) & 0b11111111) << 16)+ ((~(data[1]-1) & 0b11111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
+                                    plcValue = IEC61131ValueHandler.of((((~data.get(3) & 0b01111111) << 24) + ((~(data.get(2)-1) & 0b11111111) << 16)+ ((~(data.get(1)-1) & 0b11111111) << 8) + (~(data.get(0)-1) & 0b11111111))  * -1);  // negative number
                                 }
                             }
                             break;
                         case SINGLEBIT:
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
-                                short[] data = df1PTLR.getData();
+                                List<Short> data = df1PTLR.getData();
                                 if (field.getBitNumber() < 8) {
-                                    plcValue = IEC61131ValueHandler.of((data[0] & (1 <<  field.getBitNumber())) != 0);         // read from first byte
+                                    plcValue = IEC61131ValueHandler.of((data.get(0) & (1 <<  field.getBitNumber())) != 0);         // read from first byte
                                 } else {
-                                    plcValue = IEC61131ValueHandler.of((data[1] & (1 << (field.getBitNumber() - 8) )) != 0);   // read from second byte
+                                    plcValue = IEC61131ValueHandler.of((data.get(1) & (1 << (field.getBitNumber() - 8) )) != 0);   // read from second byte
                                 }
                             }
                             break;
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
index cb0a6b8..55f8490 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
@@ -48,10 +48,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.time.Duration;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
@@ -240,7 +237,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
             directAdsFields.stream().map(directAdsField -> new AdsMultiRequestItemRead(
                 directAdsField.getIndexGroup(), directAdsField.getIndexOffset(),
                 (directAdsField.getAdsDataType().getNumBytes() * directAdsField.getNumberOfElements())))
-                .toArray(AdsMultiRequestItem[]::new), null);
+                .collect(Collectors.toList()), null);
 
         AmsPacket amsPacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
             configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
@@ -503,7 +500,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
             directAdsFields.stream().map(directAdsField -> new AdsMultiRequestItemWrite(
                 directAdsField.getIndexGroup(), directAdsField.getIndexOffset(),
                 ((long) directAdsField.getAdsDataType().getNumBytes() * directAdsField.getNumberOfElements())))
-                .toArray(AdsMultiRequestItem[]::new), writeBuffer);
+                .collect(Collectors.toList()), writeBuffer);
 
         AmsPacket amsPacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
             configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
@@ -690,7 +687,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
             symbolicAdsFields.size(), expectedResponseDataSize, symbolicAdsFields.stream().map(symbolicAdsField ->
             new AdsMultiRequestItemReadWrite(ReservedIndexGroups.ADSIGRP_SYM_HNDBYNAME.getValue(), 0,
                 4, symbolicAdsField.getSymbolicAddress().length())
-        ).toArray(AdsMultiRequestItem[]::new), addressData);
+        ).collect(Collectors.toList()), addressData);
         AmsPacket amsPacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
             configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
             CommandId.ADS_READ_WRITE, DEFAULT_COMMAND_STATE, 0, getInvokeId(), adsData);
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java
index 251d305..d245103 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java
@@ -49,7 +49,7 @@ public class FieldReaderArray<T> implements FieldReader<T> {
         int itemCount = Math.max(0, (int) count);
         List<T> result = new ArrayList<>(itemCount);
         for (int curItem = 0; curItem < itemCount; curItem++) {
-            result.set(curItem, dataReader.read("", readerArgs));
+            result.add(dataReader.read("", readerArgs));
         }
         dataReader.closeContext(logicalName, readerArgs);
         return result;
@@ -59,8 +59,9 @@ public class FieldReaderArray<T> implements FieldReader<T> {
         // Ensure we have the render as list argument present
         readerArgs = ArrayUtils.add(readerArgs, WithReaderWriterArgs.WithRenderAsList(true));
         dataReader.pullContext(logicalName, readerArgs);
-        List<T> result = new LinkedList<>();
-        while (dataReader.getPos() < length) {
+        int startPos = dataReader.getPos();
+        List<T> result = new ArrayList<>();
+        while (dataReader.getPos() < startPos + length) {
             result.add(dataReader.read("", readerArgs));
         }
         dataReader.closeContext(logicalName, readerArgs);
@@ -71,7 +72,7 @@ public class FieldReaderArray<T> implements FieldReader<T> {
         // Ensure we have the render as list argument present
         readerArgs = ArrayUtils.add(readerArgs, WithReaderWriterArgs.WithRenderAsList(true));
         dataReader.pullContext(logicalName, readerArgs);
-        List<T> result = new LinkedList<>();
+        List<T> result = new ArrayList<>();
         while (!termination.get()) {
             result.add(dataReader.read("", readerArgs));
         }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java
index c08d465..f1c58bc 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java
@@ -111,7 +111,8 @@ public class ReadBufferXmlBased implements ReadBuffer, BufferCommons {
         hexString = hexString.substring(2);
         byte[] bytes = new byte[numberOfBytes];
         for (int i = 0; i < hexString.length(); i = i + 2) {
-            bytes[i / 2] = Byte.parseByte(hexString.substring(i, i + 2), 16);
+            // Without this hack, we can't parse values such as "0x80" into a byte.
+            bytes[i / 2] = (byte) Short.parseShort(hexString.substring(i, i + 2), 16);
         }
         return bytes;
     }
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec b/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
index d8a6f15..1542275 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
@@ -24,9 +24,9 @@
 [discriminatedType 'AdsDiscovery' byteOrder='"BIG_ENDIAN"'
     [const uint 32 'header' '0x03661471L']
     [reserved   uint 32  '0x00000000L']
-    [enum Operation 'operation']
+    [simple     Operation 'operation']
     [reserved   uint 16  '0x0000']
-    [enum Direction 'direction']
+    [simple     Direction 'direction']
     [typeSwitch 'operation', 'direction'
         ['DISCOVERY', 'REQUEST' DiscoveryRequest
             [simple AmsNetId 'amsNetId']
@@ -63,7 +63,7 @@
             [reserved uint 16 '0x1027']
             [reserved uint 16 '0x0100']
             [reserved uint 32 '0x00000100']
-            [enum RouteStatus 'status']
+            [simple   RouteStatus 'status']
             [reserved uint 24 '0x000000']
         ]
     ]
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads.mspec b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
index c4eb99c..4b8221a 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@ -206,7 +206,7 @@
             // Build	2 bytes	Build number
             [simple uint 16  'version']
             // Name	16 bytes	Name of ADS device
-            [array int 8  'device' count '16']
+            [array byte  'device' count '16']
         ]
 
         ['ADS_READ', 'false' AdsReadRequest
@@ -223,7 +223,7 @@
             // 4 bytes	Length of data which are supplied back.
             [implicit uint 32 'length' 'COUNT(data)']
             // n bytes	Data which are supplied back.
-            [array int 8 'data' count 'length']
+            [array byte 'data' count 'length']
         ]
 
         ['ADS_WRITE', 'false' AdsWriteRequest
@@ -234,7 +234,7 @@
             // 4 bytes	Length of the data (in bytes) which should be written.
             [implicit uint 32 'length' 'COUNT(data)']
             // n bytes	Data which are written in the ADS device.
-            [array int 8 'data' count 'length']
+            [array byte 'data' count 'length']
         ]
         ['ADS_WRITE', 'true' AdsWriteResponse
             // 4 bytes	ADS error number
@@ -259,7 +259,7 @@
             // 4 bytes	Length of data in byte.
             [implicit uint 32 'length' 'COUNT(data)']
             // n bytes	Additional data which are sent to the ADS device
-            [array int 8 'data' count 'length']
+            [array byte 'data' count 'length']
         ]
         ['ADS_WRITE_CONTROL', 'true' AdsWriteControlResponse
             // 4 bytes	ADS error number
@@ -321,7 +321,7 @@
             // Only if the indexGroup implies a sum-read response, will the indexOffset indicate the number of elements. (ADSIGRP_MULTIPLE_READ, ADSIGRP_MULTIPLE_WRITE, ADSIGRP_MULTIPLE_READ_WRITE)
             [array  AdsMultiRequestItem('indexGroup') 'items' count '((indexGroup == 61568) || (indexGroup == 61569) || (indexGroup == 61570)) ? indexOffset : 0']
             // n bytes	Data which are written in the ADS device.
-            [array int 8 'data' count 'writeLength - (COUNT(items) * 12)']
+            [array byte 'data' count 'writeLength - (COUNT(items) * 12)']
         ]
         ['ADS_READ_WRITE', 'true' AdsReadWriteResponse
             // 4 bytes	ADS error number
@@ -329,7 +329,7 @@
             // 4 bytes	Length of data in byte.
             [implicit uint 32 'length'  'COUNT(data)']
             // n bytes Additional data which are sent to the ADS device
-            [array int 8 'data' count 'length']
+            [array byte 'data' count 'length']
         ]
     ]
 ]
@@ -383,7 +383,7 @@
     // 4 Bytes	Size of data range in bytes.
     [simple uint 32 'sampleSize']
     // n Bytes	Data
-    [array int 8 'data' count 'sampleSize']
+    [array byte 'data' count 'sampleSize']
 ]
 
 [dataIo 'DataItem' (vstring 'dataFormatName', int 32 'stringLength')
diff --git a/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml b/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
index bb509cb..77443ba 100644
--- a/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
+++ b/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
@@ -178,9 +178,7 @@
                       <ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
                     </result>
                     <length dataType="uint" bitLength="32">1</length>
-                    <data isList="true">
-                      <value dataType="int" bitLength="8">1</value>
-                    </data>
+                    <data dataType="byte" bitLength="8">0x01</data>
                   </AdsReadResponse>
                 </AdsData>
               </data>
@@ -308,8 +306,7 @@
                         </AdsMultiRequestItemRead>
                       </AdsMultiRequestItem>
                     </items>
-                    <data isList="true">
-                    </data>
+                    <data dataType="byte" bitLength="0">0x</data>
                   </AdsReadWriteRequest>
                 </AdsData>
               </data>
@@ -373,18 +370,7 @@
                       <ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
                     </result>
                     <length dataType="uint" bitLength="32">10</length>
-                    <data isList="true">
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">1</value>
-                      <value dataType="int" bitLength="8">1</value>
-                    </data>
+                    <data dataType="byte" bitLength="80">0x00000000000000000101</data>
                   </AdsReadWriteResponse>
                 </AdsData>
               </data>
@@ -509,34 +495,7 @@
                     <writeLength dataType="uint" bitLength="32">26</writeLength>
                     <items isList="true">
                     </items>
-                    <data isList="true">
-                      <value dataType="int" bitLength="8">109</value>
-                      <value dataType="int" bitLength="8">97</value>
-                      <value dataType="int" bitLength="8">105</value>
-                      <value dataType="int" bitLength="8">110</value>
-                      <value dataType="int" bitLength="8">46</value>
-                      <value dataType="int" bitLength="8">102</value>
-                      <value dataType="int" bitLength="8">95</value>
-                      <value dataType="int" bitLength="8">116</value>
-                      <value dataType="int" bitLength="8">114</value>
-                      <value dataType="int" bitLength="8">105</value>
-                      <value dataType="int" bitLength="8">103</value>
-                      <value dataType="int" bitLength="8">68</value>
-                      <value dataType="int" bitLength="8">97</value>
-                      <value dataType="int" bitLength="8">116</value>
-                      <value dataType="int" bitLength="8">101</value>
-                      <value dataType="int" bitLength="8">105</value>
-                      <value dataType="int" bitLength="8">71</value>
-                      <value dataType="int" bitLength="8">101</value>
-                      <value dataType="int" bitLength="8">108</value>
-                      <value dataType="int" bitLength="8">101</value>
-                      <value dataType="int" bitLength="8">115</value>
-                      <value dataType="int" bitLength="8">101</value>
-                      <value dataType="int" bitLength="8">110</value>
-                      <value dataType="int" bitLength="8">46</value>
-                      <value dataType="int" bitLength="8">77</value>
-                      <value dataType="int" bitLength="8">0</value>
-                    </data>
+                    <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
                   </AdsReadWriteRequest>
                 </AdsData>
               </data>
@@ -599,12 +558,7 @@
                       <ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
                     </result>
                     <length dataType="uint" bitLength="32">4</length>
-                    <data isList="true">
-                      <value dataType="int" bitLength="8">1</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">-128</value>
-                      <value dataType="int" bitLength="8">27</value>
-                    </data>
+                    <data dataType="byte" bitLength="32">0x0100801b</data>
                   </AdsReadWriteResponse>
                 </AdsData>
               </data>
@@ -728,18 +682,7 @@
                       <ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
                     </result>
                     <length dataType="uint" bitLength="32">10</length>
-                    <data isList="true">
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">1</value>
-                      <value dataType="int" bitLength="8">1</value>
-                    </data>
+                    <data dataType="byte" bitLength="80">0x00000000000000000101</data>
                   </AdsReadResponse>
                 </AdsData>
               </data>
@@ -848,34 +791,7 @@
                     <writeLength dataType="uint" bitLength="32">26</writeLength>
                     <items isList="true">
                     </items>
-                    <data isList="true">
-                      <value dataType="int" bitLength="8">109</value>
-                      <value dataType="int" bitLength="8">97</value>
-                      <value dataType="int" bitLength="8">105</value>
-                      <value dataType="int" bitLength="8">110</value>
-                      <value dataType="int" bitLength="8">46</value>
-                      <value dataType="int" bitLength="8">102</value>
-                      <value dataType="int" bitLength="8">95</value>
-                      <value dataType="int" bitLength="8">116</value>
-                      <value dataType="int" bitLength="8">114</value>
-                      <value dataType="int" bitLength="8">105</value>
-                      <value dataType="int" bitLength="8">103</value>
-                      <value dataType="int" bitLength="8">68</value>
-                      <value dataType="int" bitLength="8">97</value>
-                      <value dataType="int" bitLength="8">116</value>
-                      <value dataType="int" bitLength="8">101</value>
-                      <value dataType="int" bitLength="8">105</value>
-                      <value dataType="int" bitLength="8">71</value>
-                      <value dataType="int" bitLength="8">101</value>
-                      <value dataType="int" bitLength="8">108</value>
-                      <value dataType="int" bitLength="8">101</value>
-                      <value dataType="int" bitLength="8">115</value>
-                      <value dataType="int" bitLength="8">101</value>
-                      <value dataType="int" bitLength="8">110</value>
-                      <value dataType="int" bitLength="8">46</value>
-                      <value dataType="int" bitLength="8">77</value>
-                      <value dataType="int" bitLength="8">0</value>
-                    </data>
+                    <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
                   </AdsReadWriteRequest>
                 </AdsData>
               </data>
@@ -938,12 +854,7 @@
                       <ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
                     </result>
                     <length dataType="uint" bitLength="32">4</length>
-                    <data isList="true">
-                      <value dataType="int" bitLength="8">1</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">-128</value>
-                      <value dataType="int" bitLength="8">27</value>
-                    </data>
+                    <data dataType="byte" bitLength="32">0x0100801b</data>
                   </AdsReadWriteResponse>
                 </AdsData>
               </data>
@@ -1068,18 +979,7 @@
                       <ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
                     </result>
                     <length dataType="uint" bitLength="32">10</length>
-                    <data isList="true">
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">1</value>
-                      <value dataType="int" bitLength="8">1</value>
-                    </data>
+                    <data dataType="byte" bitLength="80">0x00000000000000000101</data>
                   </AdsReadResponse>
                 </AdsData>
               </data>
@@ -1238,18 +1138,7 @@
                       <ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
                     </result>
                     <length dataType="uint" bitLength="32">10</length>
-                    <data isList="true">
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">0</value>
-                      <value dataType="int" bitLength="8">1</value>
-                      <value dataType="int" bitLength="8">1</value>
-                    </data>
+                    <data dataType="byte" bitLength="80">0x00000000000000000101</data>
                   </AdsReadResponse>
                 </AdsData>
               </data>
diff --git a/protocols/ads/src/test/resources/protocols/ads/ParserSerializerTestsuite.xml b/protocols/ads/src/test/resources/protocols/ads/ParserSerializerTestsuite.xml
index 8f6e507..3e38fcc 100644
--- a/protocols/ads/src/test/resources/protocols/ads/ParserSerializerTestsuite.xml
+++ b/protocols/ads/src/test/resources/protocols/ads/ParserSerializerTestsuite.xml
@@ -151,9 +151,7 @@
                     <ReturnCode dataType="uint" bitLength="32" stringRepresentation="OK">0</ReturnCode>
                   </result>
                   <length dataType="uint" bitLength="32">1</length>
-                  <data isList="true">
-                    <value dataType="int" bitLength="8">1</value>
-                  </data>
+                  <data dataType="byte" bitLength="8">0x01</data>
                 </AdsReadResponse>
               </AdsData>
             </data>
@@ -224,34 +222,7 @@
                   <writeLength dataType="uint" bitLength="32">26</writeLength>
                   <items isList="true">
                   </items>
-                  <data isList="true">
-                    <value dataType="int" bitLength="8">109</value>
-                    <value dataType="int" bitLength="8">97</value>
-                    <value dataType="int" bitLength="8">105</value>
-                    <value dataType="int" bitLength="8">110</value>
-                    <value dataType="int" bitLength="8">46</value>
-                    <value dataType="int" bitLength="8">102</value>
-                    <value dataType="int" bitLength="8">95</value>
-                    <value dataType="int" bitLength="8">116</value>
-                    <value dataType="int" bitLength="8">114</value>
-                    <value dataType="int" bitLength="8">105</value>
-                    <value dataType="int" bitLength="8">103</value>
-                    <value dataType="int" bitLength="8">68</value>
-                    <value dataType="int" bitLength="8">97</value>
-                    <value dataType="int" bitLength="8">116</value>
-                    <value dataType="int" bitLength="8">101</value>
-                    <value dataType="int" bitLength="8">105</value>
-                    <value dataType="int" bitLength="8">71</value>
-                    <value dataType="int" bitLength="8">101</value>
-                    <value dataType="int" bitLength="8">108</value>
-                    <value dataType="int" bitLength="8">101</value>
-                    <value dataType="int" bitLength="8">115</value>
-                    <value dataType="int" bitLength="8">101</value>
-                    <value dataType="int" bitLength="8">110</value>
-                    <value dataType="int" bitLength="8">46</value>
-                    <value dataType="int" bitLength="8">77</value>
-                    <value dataType="int" bitLength="8">0</value>
-                  </data>
+                  <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
                 </AdsReadWriteRequest>
               </AdsData>
             </data>
@@ -320,12 +291,7 @@
                     <ReturnCode dataType="uint" bitLength="32" stringRepresentation="OK">0</ReturnCode>
                   </result>
                   <length dataType="uint" bitLength="32">4</length>
-                  <data isList="true">
-                    <value dataType="int" bitLength="8">1</value>
-                    <value dataType="int" bitLength="8">0</value>
-                    <value dataType="int" bitLength="8">-128</value>
-                    <value dataType="int" bitLength="8">27</value>
-                  </data>
+                  <data dataType="byte" bitLength="32">0x0100801b</data>
                 </AdsReadWriteResponse>
               </AdsData>
             </data>
@@ -461,9 +427,7 @@
                     <ReturnCode dataType="uint" bitLength="32" stringRepresentation="OK">0</ReturnCode>
                   </result>
                   <length dataType="uint" bitLength="32">1</length>
-                  <data isList="true">
-                    <value dataType="int" bitLength="8">1</value>
-                  </data>
+                  <data dataType="byte" bitLength="8">0x01</data>
                 </AdsReadResponse>
               </AdsData>
             </data>
@@ -531,12 +495,7 @@
                   <indexGroup dataType="uint" bitLength="32">61446</indexGroup>
                   <indexOffset dataType="uint" bitLength="32">0</indexOffset>
                   <length dataType="uint" bitLength="32">4</length>
-                  <data isList="true">
-                    <value dataType="int" bitLength="8">1</value>
-                    <value dataType="int" bitLength="8">0</value>
-                    <value dataType="int" bitLength="8">-128</value>
-                    <value dataType="int" bitLength="8">27</value>
-                  </data>
+                  <data dataType="byte" bitLength="32">0x0100801b</data>
                 </AdsWriteRequest>
               </AdsData>
             </data>