diff --git a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayBenchmark/ConvertHexStringToByteArrayBenchmarks.csproj b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayBenchmark/ConvertHexStringToByteArrayBenchmarks.csproj index 03775a2c53..ad025981d4 100644 --- a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayBenchmark/ConvertHexStringToByteArrayBenchmarks.csproj +++ b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayBenchmark/ConvertHexStringToByteArrayBenchmarks.csproj @@ -1,13 +1,12 @@  Exe - net7.0 + net10.0 enable enable - - + diff --git a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayBenchmark/Program.cs b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayBenchmark/Program.cs index eb37090045..abf55851f2 100644 --- a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayBenchmark/Program.cs +++ b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayBenchmark/Program.cs @@ -1,4 +1,4 @@ using BenchmarkDotNet.Running; using ConvertHexStringToByteArray.Benchmarks; -BenchmarkRunner.Run(); \ No newline at end of file +BenchmarkRunner.Run(args: args); \ No newline at end of file diff --git a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayConsole/ConvertHexStringToByteArrayConsole.csproj b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayConsole/ConvertHexStringToByteArrayConsole.csproj index 794c118f68..356e2d662d 100644 --- a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayConsole/ConvertHexStringToByteArrayConsole.csproj +++ b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayConsole/ConvertHexStringToByteArrayConsole.csproj @@ -1,7 +1,7 @@  Exe - net7.0 + net10.0 enable enable diff --git a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayConsole/Program.cs b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayConsole/Program.cs index 80523849f6..633bba955e 100644 --- a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayConsole/Program.cs +++ b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayConsole/Program.cs @@ -17,5 +17,9 @@ result = ConversionHelpers.FromHexWithLookup(input); PrintResult(nameof(ConversionHelpers.FromHexWithLookup), result); +Span buffer = stackalloc byte[8]; +var status = Convert.FromHexString("ABC", buffer, out var charsConsumed, out var bytesWritten); +Console.WriteLine($"odd: {status} consumed={charsConsumed} written={bytesWritten}"); + static void PrintResult(string method, IEnumerable input) => Console.WriteLine($"{method}: \t[{string.Join(',', input)}]"); \ No newline at end of file diff --git a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayLibrary/ConversionHelpers.cs b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayLibrary/ConversionHelpers.cs index 01b78950f0..9f47647461 100644 --- a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayLibrary/ConversionHelpers.cs +++ b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayLibrary/ConversionHelpers.cs @@ -20,7 +20,7 @@ public static byte[] FromHexWithModularArithmetic(ReadOnlySpan input) var dest = new byte[input.Length >> 1]; for (int i = 0, j = 0; j < dest.Length; j++) - dest[j] = (byte)((PerformModularArithmeticCalculation(input[i++]) << 4) + + dest[j] = (byte) ((PerformModularArithmeticCalculation(input[i++]) << 4) + PerformModularArithmeticCalculation(input[i++])); return dest; @@ -53,7 +53,8 @@ public static unsafe byte[] FromHexWithSwitchComputation(ReadOnlySpan inpu { var destPtr = d; var srcPtr = s; - while (*srcPtr != 0) + var srcEnd = s + input.Length; + while (srcPtr < srcEnd) { var result = (byte) (ComputeNibbleFromHexChar(*srcPtr++) << 4); result |= ComputeNibbleFromHexChar(*srcPtr++); @@ -89,7 +90,8 @@ public static unsafe byte[] FromHexWithBitManipulation(ReadOnlySpan input) { var sPtr = &srcPtr[0]; var dPtr = &destPtr[0]; - while (*sPtr != 0) + var sEnd = sPtr + input.Length; + while (sPtr < sEnd) { var hi = PerformBitManipulation(*sPtr++); var lo = PerformBitManipulation(*sPtr++) & 0x0F; @@ -127,14 +129,15 @@ public static unsafe byte[] FromHexWithLookup(ReadOnlySpan input) { var s = &inputRef[0]; var d = destRef; + var end = s + input.Length; - while (*s != 0) + while (s < end) { byte lowValue; if (*s > 102 || (*d = hiRef[*s++]) == 255 || - *s > 102 || (lowValue = lowRef[*s++]) == 255 ) - throw new ArgumentException($"Invalid character found in string: '{*s}'", nameof(input)); + *s > 102 || (lowValue = lowRef[*s++]) == 255) + throw new ArgumentException("Input contains a non-hex character", nameof(input)); *d++ += lowValue; } diff --git a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayLibrary/ConvertHexStringToByteArrayLibrary.csproj b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayLibrary/ConvertHexStringToByteArrayLibrary.csproj index d3971e43df..8186353f28 100644 --- a/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayLibrary/ConvertHexStringToByteArrayLibrary.csproj +++ b/collections-arrays/ConvertHexStringToByteArray/src/ConvertHexStringToByteArrayLibrary/ConvertHexStringToByteArrayLibrary.csproj @@ -1,6 +1,6 @@  - net7.0 + net10.0 enable enable true diff --git a/collections-arrays/ConvertHexStringToByteArray/test/ConvertHexStringToByteArrayUnitTests/ConvertHexByteArrayTests.cs b/collections-arrays/ConvertHexStringToByteArray/test/ConvertHexStringToByteArrayUnitTests/ConvertHexByteArrayTests.cs index 8be64b5f5a..f24640fa4b 100644 --- a/collections-arrays/ConvertHexStringToByteArray/test/ConvertHexStringToByteArrayUnitTests/ConvertHexByteArrayTests.cs +++ b/collections-arrays/ConvertHexStringToByteArray/test/ConvertHexStringToByteArrayUnitTests/ConvertHexByteArrayTests.cs @@ -142,4 +142,16 @@ public void GivenLookupMethod_WhenInvalidHexDataIsProvided_ThenThrowsArgumentExc { Assert.Throws(() => ConversionHelpers.FromHexWithLookup(source)); } + [Fact] + public void GivenSliceOfLongerString_WhenConverting_ThenEveryMethodStopsAtTheEndOfTheSlice() + { + var slice = "DEADZZ".AsSpan(0, 4); + var expected = new byte[] {222, 173}; + + Assert.Equal(expected, ConversionHelpers.FromHexWithModularArithmetic(slice)); + Assert.Equal(expected, ConversionHelpers.FromHexWithSwitchComputation(slice)); + Assert.Equal(expected, ConversionHelpers.FromHexWithBitManipulation(slice)); + Assert.Equal(expected, ConversionHelpers.FromHexWithConvert(slice)); + Assert.Equal(expected, ConversionHelpers.FromHexWithLookup(slice)); + } } \ No newline at end of file diff --git a/collections-arrays/ConvertHexStringToByteArray/test/ConvertHexStringToByteArrayUnitTests/ConvertHexStringToByteArrayUnitTests.csproj b/collections-arrays/ConvertHexStringToByteArray/test/ConvertHexStringToByteArrayUnitTests/ConvertHexStringToByteArrayUnitTests.csproj index 1a5e6ef094..611898a078 100644 --- a/collections-arrays/ConvertHexStringToByteArray/test/ConvertHexStringToByteArrayUnitTests/ConvertHexStringToByteArrayUnitTests.csproj +++ b/collections-arrays/ConvertHexStringToByteArray/test/ConvertHexStringToByteArrayUnitTests/ConvertHexStringToByteArrayUnitTests.csproj @@ -1,19 +1,19 @@  - net7.0 + net10.0 enable enable false true - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all