From 4fcab9a1671606a6028df6e5f1e460d1ddff9a8f Mon Sep 17 00:00:00 2001 From: Michael Croes Date: Wed, 11 Jul 2018 22:19:02 +0200 Subject: [PATCH 1/3] Fix VarTypeToByteLength for bit arrays --- S7.Net/PLCHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/S7.Net/PLCHelpers.cs b/S7.Net/PLCHelpers.cs index 803d349..e67d394 100644 --- a/S7.Net/PLCHelpers.cs +++ b/S7.Net/PLCHelpers.cs @@ -172,7 +172,7 @@ namespace S7.Net switch (varType) { case VarType.Bit: - return varCount; //TODO + return varCount + 7 / 8; case VarType.Byte: return (varCount < 1) ? 1 : varCount; case VarType.String: From b3cb45de37bf6983780b9960265abaef0be398b4 Mon Sep 17 00:00:00 2001 From: Michael Croes Date: Wed, 11 Jul 2018 22:30:10 +0200 Subject: [PATCH 2/3] Add ToBitArray overload with length --- S7.Net/Types/Bit.cs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/S7.Net/Types/Bit.cs b/S7.Net/Types/Bit.cs index 5f00476..5214fd9 100644 --- a/S7.Net/Types/Bit.cs +++ b/S7.Net/Types/Bit.cs @@ -1,4 +1,5 @@ -using System.Collections; +using System; +using System.Collections; namespace S7.Net.Types { @@ -16,12 +17,27 @@ namespace S7.Net.Types } /// - /// Converts an array of bytes to a BitArray + /// Converts an array of bytes to a BitArray. /// - public static BitArray ToBitArray(byte[] bytes) + /// The bytes to convert. + /// A BitArray with the same number of bits and equal values as . + public static BitArray ToBitArray(byte[] bytes) => ToBitArray(bytes, bytes.Length * 8); + + /// + /// Converts an array of bytes to a BitArray. + /// + /// The bytes to convert. + /// The number of bits to return. + /// A BitArray with bits. + public static BitArray ToBitArray(byte[] bytes, int length) { - BitArray bitArr = new BitArray(bytes); - return bitArr; + if (length > bytes.Length * 8) throw new ArgumentException($"Not enough data in bytes to return {length} bits.", nameof(bytes)); + + var bitArr = new BitArray(bytes); + var bools = new bool[length]; + for (var i = 0; i < length; i++) bools[i] = bitArr[i]; + + return new BitArray(bools); } } } From 6a84b6f1247806eb5f392edae28f6141cec4bc4a Mon Sep 17 00:00:00 2001 From: Michael Croes Date: Wed, 11 Jul 2018 22:30:53 +0200 Subject: [PATCH 3/3] Use ToBitArray overload with length in ParseBytes --- S7.Net/PLCHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/S7.Net/PLCHelpers.cs b/S7.Net/PLCHelpers.cs index e67d394..2ea37cd 100644 --- a/S7.Net/PLCHelpers.cs +++ b/S7.Net/PLCHelpers.cs @@ -145,7 +145,7 @@ namespace S7.Net } else { - return Bit.ToBitArray(bytes); + return Bit.ToBitArray(bytes, varCount); } case VarType.DateTime: if (varCount == 1)