diff --git a/MBS.Framework/MBS.Framework.csproj b/MBS.Framework/MBS.Framework.csproj index 0c789ed..50481c5 100644 --- a/MBS.Framework/MBS.Framework.csproj +++ b/MBS.Framework/MBS.Framework.csproj @@ -70,6 +70,7 @@ + diff --git a/MBS.Framework/MemsetExtension.cs b/MBS.Framework/MemsetExtension.cs new file mode 100644 index 0000000..cb4bdfb --- /dev/null +++ b/MBS.Framework/MemsetExtension.cs @@ -0,0 +1,62 @@ +// +// ArrayExtensions.cs +// +// Author: +// Mike Becker +// +// Copyright (c) 2019 Mike Becker +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.InteropServices; + +namespace MBS.Framework +{ + public static class MemsetExtension + { + private static Action MemsetDelegate = null; + + /// + /// Clears the specified , filling all values with the desired . + /// + /// The array to clear.. + /// The value to set all items in the array to. + public static void Clear(this byte[] array, byte value = 0x00) + { + // Thanks https://stackoverflow.com/questions/1897555/what-is-the-equivalent-of-memset-in-c + if (MemsetDelegate == null) + { + var dynamicMethod = new DynamicMethod("Memset", MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, + null, new[] { typeof(IntPtr), typeof(byte), typeof(int) }, typeof(MemsetExtension), true); + + var generator = dynamicMethod.GetILGenerator(); + generator.Emit(OpCodes.Ldarg_0); + generator.Emit(OpCodes.Ldarg_1); + generator.Emit(OpCodes.Ldarg_2); + generator.Emit(OpCodes.Initblk); + generator.Emit(OpCodes.Ret); + + MemsetDelegate = (Action)dynamicMethod.CreateDelegate(typeof(Action)); + } + + var gcHandle = GCHandle.Alloc(array, GCHandleType.Pinned); + MemsetDelegate(gcHandle.AddrOfPinnedObject(), value, array.Length); + gcHandle.Free(); + + } + } +} \ No newline at end of file