Give the option of changing the Encoding used to serialize and deserialize S7String, instead of always using Encoding.ASCII

This commit is contained in:
diego
2022-06-16 17:21:23 +02:00
parent b475aee2e7
commit d808ea5eb6

View File

@@ -9,6 +9,11 @@ namespace S7.Net.Types
/// </summary>
public static class S7String
{
/// <summary>
/// The Encoding used when serializing and deserializing S7String (Encoding.ASCII by default)
/// </summary>
public static Encoding StringEncoding { get; set; }
/// <summary>
/// Converts S7 bytes to a string
/// </summary>
@@ -30,7 +35,8 @@ namespace S7.Net.Types
try
{
return Encoding.ASCII.GetString(bytes, 2, length);
if (StringEncoding == null) StringEncoding = Encoding.ASCII;
return StringEncoding.GetString(bytes, 2, length);
}
catch (Exception e)
{
@@ -38,7 +44,6 @@ namespace S7.Net.Types
$"Failed to parse {VarType.S7String} from data. Following fields were read: size: '{size}', actual length: '{length}', total number of bytes (including header): '{bytes.Length}'.",
e);
}
}
/// <summary>
@@ -54,9 +59,10 @@ namespace S7.Net.Types
throw new ArgumentNullException(nameof(value));
}
if (reservedLength > 254) throw new ArgumentException($"The maximum string length supported is 254.");
var bytes = Encoding.ASCII.GetBytes(value);
if (reservedLength > 254) throw new ArgumentException($"The maximum string length supported is 254.");
if (StringEncoding == null) StringEncoding = Encoding.ASCII;
var bytes = StringEncoding.GetBytes(value);
if (bytes.Length > reservedLength) throw new ArgumentException($"The provided string length ({bytes.Length} is larger than the specified reserved length ({reservedLength}).");
var buffer = new byte[2 + reservedLength];
@@ -65,5 +71,13 @@ namespace S7.Net.Types
buffer[1] = (byte)bytes.Length;
return buffer;
}
/// <summary>
/// Initializes default static properties
/// </summary>
static S7String()
{
StringEncoding = Encoding.ASCII;
}
}
}