From 3fa44a3e9d8367fd0a2916e0312d7d58fa8189a0 Mon Sep 17 00:00:00 2001 From: Anders Bjerner Date: Mon, 14 Feb 2022 16:21:00 +0100 Subject: [PATCH] Introduced new "StringUtils.ParseHexString" method --- .../Strings/StringUtils.Bytes.cs | 20 ++++++ src/UnitTestProject1/Strings/HexTests.cs | 71 +++++++++++++++++++ src/UnitTestProject1/UnitTestProject1.csproj | 1 + 3 files changed, 92 insertions(+) create mode 100644 src/UnitTestProject1/Strings/HexTests.cs diff --git a/src/Skybrud.Essentials/Strings/StringUtils.Bytes.cs b/src/Skybrud.Essentials/Strings/StringUtils.Bytes.cs index 7bcdb60..77aebb8 100644 --- a/src/Skybrud.Essentials/Strings/StringUtils.Bytes.cs +++ b/src/Skybrud.Essentials/Strings/StringUtils.Bytes.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace Skybrud.Essentials.Strings { @@ -26,6 +27,25 @@ public static string ToHexString(byte[] bytes, HexFormat format) { _ => throw new Exception($"Unsupported format: {format}") }; } + + /// + /// Parse the specified HEX string into a corresponding array of . + /// + /// The HEX string to parse. + /// + public static byte[] ParseHexString(string hex) { + + if (string.IsNullOrWhiteSpace(hex)) throw new ArgumentNullException(nameof(hex)); + + // Detect whether the HEX string uses hyphens + int mod = hex.Length > 2 && hex[2] == '-' ? 3 : 2; + + return Enumerable.Range(0, hex.Length) + .Where(x => x % mod == 0) + .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) + .ToArray(); + + } } diff --git a/src/UnitTestProject1/Strings/HexTests.cs b/src/UnitTestProject1/Strings/HexTests.cs new file mode 100644 index 0000000..d0e5a65 --- /dev/null +++ b/src/UnitTestProject1/Strings/HexTests.cs @@ -0,0 +1,71 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Skybrud.Essentials.Strings; +using System.Text; + +namespace UnitTestProject1.Strings { + + [TestClass] + public class HexTests { + + [TestMethod] + public void ToHexString() { + + byte[] bytes1 = Encoding.UTF8.GetBytes("hello world"); + byte[] bytes2 = Encoding.UTF8.GetBytes("rød grød med fløde"); + byte[] bytes3 = Encoding.GetEncoding(1252).GetBytes("rød grød med fløde"); + + string result1 = StringUtils.ToHexString(bytes1); + string result2 = StringUtils.ToHexString(bytes2); + string result3 = StringUtils.ToHexString(bytes3); + + Assert.AreEqual("68656c6c6f20776f726c64", result1, "#1"); + Assert.AreEqual("72c3b864206772c3b864206d656420666cc3b86465", result2, "#2"); + Assert.AreEqual("72f864206772f864206d656420666cf86465", result3, "#3"); + + } + + [TestMethod] + public void ParseHexString() { + + string hex1 = "68656c6c6f20776f726c64"; + string hex2 = "72c3b864206772c3b864206d656420666cc3b86465"; + string hex3 = "72f864206772f864206d656420666cf86465"; + + byte[] result1 = StringUtils.ParseHexString(hex1); + byte[] result2 = StringUtils.ParseHexString(hex2); + byte[] result3 = StringUtils.ParseHexString(hex3); + + string str1 = Encoding.UTF8.GetString(result1); + string str2 = Encoding.UTF8.GetString(result2); + string str3 = Encoding.GetEncoding(1252).GetString(result3); + + Assert.AreEqual("hello world", str1, "#1"); + Assert.AreEqual("rød grød med fløde", str2, "#2"); + Assert.AreEqual("rød grød med fløde", str3, "#3"); + + } + + [TestMethod] + public void ParseHexStringWithHypens() { + + string hex1 = "68-65-6c-6c-6f-20-77-6f-72-6c-64"; + string hex2 = "72-c3-b8-64-20-67-72-c3-b8-64-20-6d-65-64-20-66-6c-c3-b8-64-65"; + string hex3 = "72-f8-64-20-67-72-f8-64-20-6d-65-64-20-66-6c-f8-64-65"; + + byte[] result1 = StringUtils.ParseHexString(hex1); + byte[] result2 = StringUtils.ParseHexString(hex2); + byte[] result3 = StringUtils.ParseHexString(hex3); + + string str1 = Encoding.UTF8.GetString(result1); + string str2 = Encoding.UTF8.GetString(result2); + string str3 = Encoding.GetEncoding(1252).GetString(result3); + + Assert.AreEqual("hello world", str1, "#1"); + Assert.AreEqual("rød grød med fløde", str2, "#2"); + Assert.AreEqual("rød grød med fløde", str3, "#3"); + + } + + } + +} \ No newline at end of file diff --git a/src/UnitTestProject1/UnitTestProject1.csproj b/src/UnitTestProject1/UnitTestProject1.csproj index 34fa3cb..d93a9a3 100644 --- a/src/UnitTestProject1/UnitTestProject1.csproj +++ b/src/UnitTestProject1/UnitTestProject1.csproj @@ -82,6 +82,7 @@ +