diff --git a/Dalamud/Util.cs b/Dalamud/Util.cs index 2c3bb8d7a..14f96080b 100644 --- a/Dalamud/Util.cs +++ b/Dalamud/Util.cs @@ -2,24 +2,49 @@ using System; using System.Reflection; using System.Runtime.InteropServices; using System.Text; + using Dalamud.Game; using Serilog; -namespace Dalamud { - internal static class Util { - public static void DumpMemory(IntPtr offset, int len = 512) { +namespace Dalamud +{ + /// + /// Class providing various helper methods for use in Dalamud and plugins. + /// + public static class Util + { + /// + /// Gets the assembly version of Dalamud. + /// + public static string AssemblyVersion { get; } = Assembly.GetAssembly(typeof(ChatHandlers)).GetName().Version.ToString(); + + /// + /// Read memory from an offset and hexdump them via Serilog. + /// + /// The offset to read from. + /// The length to read. + public static void DumpMemory(IntPtr offset, int len = 512) + { var data = new byte[len]; Marshal.Copy(offset, data, 0, len); Log.Information(ByteArrayToHex(data)); } - public static string ByteArrayToHex(byte[] bytes, int offset = 0, int bytesPerLine = 16) { + /// + /// Create a hexdump of the provided bytes. + /// + /// The bytes to hexdump. + /// The offset in the byte array to start at. + /// The amount of bytes to display per line. + /// The generated hexdump in string form. + public static string ByteArrayToHex(byte[] bytes, int offset = 0, int bytesPerLine = 16) + { if (bytes == null) return string.Empty; var hexChars = "0123456789ABCDEF".ToCharArray(); var offsetBlock = 8 + 3; - var byteBlock = offsetBlock + bytesPerLine * 3 + (bytesPerLine - 1) / 8 + 2; + var byteBlock = offsetBlock + (bytesPerLine * 3) + ((bytesPerLine - 1) / 8) + 2; var lineLength = byteBlock + bytesPerLine + Environment.NewLine.Length; var line = (new string(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray(); @@ -27,7 +52,8 @@ namespace Dalamud { var sb = new StringBuilder(numLines * lineLength); - for (var i = 0; i < bytes.Length; i += bytesPerLine) { + for (var i = 0; i < bytes.Length; i += bytesPerLine) + { var h = i + offset; line[0] = hexChars[(h >> 28) & 0xF]; @@ -42,18 +68,22 @@ namespace Dalamud { var hexColumn = offsetBlock; var charColumn = byteBlock; - for (var j = 0; j < bytesPerLine; j++) { + for (var j = 0; j < bytesPerLine; j++) + { if (j > 0 && (j & 7) == 0) hexColumn++; - if (i + j >= bytes.Length) { + if (i + j >= bytes.Length) + { line[hexColumn] = ' '; line[hexColumn + 1] = ' '; line[charColumn] = ' '; - } else { + } + else + { var by = bytes[i + j]; line[hexColumn] = hexChars[(by >> 4) & 0xF]; line[hexColumn + 1] = hexChars[by & 0xF]; - line[charColumn] = by < 32 ? '.' : (char) by; + line[charColumn] = by < 32 ? '.' : (char)by; } hexColumn += 3; @@ -65,7 +95,5 @@ namespace Dalamud { return sb.ToString().TrimEnd(Environment.NewLine.ToCharArray()); } - - public static string AssemblyVersion { get; } = Assembly.GetAssembly(typeof(ChatHandlers)).GetName().Version.ToString(); } }