using System.Runtime.InteropServices;
public static void Main()
var testData = "Hello, World! Lorem Ipsum\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c";
var testDataPtr = Marshal.StringToHGlobalAnsi(testData);
debug1 = DebugString("Title Here", testDataPtr, testData.Length, testData.Length - 2);
debug2 = DebugString("Title Here", testDataPtr, testData.Length, 32);
Marshal.FreeHGlobal(testDataPtr);
Console.WriteLine(debug1);
Console.WriteLine(debug2);
public static string DebugString(string title, IntPtr bytesPointer, int size, int maxSize)
throw new ArgumentOutOfRangeException("size");
if (maxSize > 0 && maxSize < size)
var sb = new StringBuilder();
sb.AppendFormat("{0}, {1} (0x{1:X}) bytes total, {2} (0x{2:X}) bytes shown:\n>", title, size, showSize);
const int bytesOnLine = 16;
var buffer = new byte[bytesOnLine];
sb.Append("\n" + offset.ToString("X8") + ": ");
var lineLength = Math.Min(showSize - offset, bytesOnLine);
var writeEllipsis = lineLength < bytesOnLine && showSize < size;
Marshal.Copy(bytesPointer + offset, buffer, 0, lineLength);
AppendHex(sb, buffer, lineLength, bytesOnLine, writeEllipsis);
AppendChars(sb, buffer, lineLength);
if (lineLength < bytesOnLine)
private static void AppendHex(StringBuilder sb, byte[] buffer, int count, int bytesOnLine, bool writeEllipsis)
for (var i = 0; i < count; i++)
sb.Append(buffer[i].ToString("X2") + " ");
var padSize = (bytesOnLine - count) * 3 + 1;
sb.Append(new string(' ', padSize));
private static void AppendChars(StringBuilder sb, byte[] buffer, int count)
for (var i = 0; i < count; i++)
var c = b < 0x20 || b >= 0x7F ? '.' : (char)b;