diff --git a/PrintHex.cs b/PrintHex.cs index 3256a19..fd605d0 100644 --- a/PrintHex.cs +++ b/PrintHex.cs @@ -37,61 +37,91 @@ namespace DiscImageChef { public static class PrintHex { - /// - /// Prints a byte array as hexadecimal values to the console - /// + /// Prints a byte array as hexadecimal values to the console /// Array /// Width of line - public static void PrintHexArray(byte[] array, int width) - { + public static void PrintHexArray(byte[] array, int width = 16) => DicConsole.WriteLine(ByteArrayToHexArrayString(array, width)); - } - /// - /// Prints a byte array as hexadecimal values to a string - /// + /// Prints a byte array as hexadecimal values to a string /// Array /// Width of line + /// Use ANSI escape colors for sections /// String containing hexadecimal values - public static string ByteArrayToHexArrayString(byte[] array, int width) + public static string ByteArrayToHexArrayString(byte[] array, int width = 16, bool color = false) { - StringBuilder sb = new StringBuilder(); + // TODO: Color list + // TODO: Allow to change width + string str = "Offset"; + int rows = array.Length / 16; + int last = array.Length % 16; + int offsetLength = $"{array.Length:X}".Length; + var sb = new StringBuilder(); - int counter = 0; - int subcounter = 0; - for(long i = 0; i < array.LongLength; i++) + if(last == 0) + last = 16; + + if(offsetLength < str.Length) + offsetLength = str.Length; + + while(str.Length < offsetLength) + str += ' '; + + if(color) + sb.Append("\u001b[36m"); + + sb.Append(str); + sb.Append(" "); + + for(int i = 0; i < 16; i++) { - if(counter == 0) - { - sb.AppendLine(); - sb.AppendFormat("{0:X16} ", i); - } - else - { - if(subcounter == 3) - { - sb.Append(" "); - subcounter = 0; - } - else - { - sb.Append(" "); - subcounter++; - } - } - - sb.AppendFormat("{0:X2}", array[i]); - - if(counter == width - 1) - { - counter = 0; - subcounter = 0; - } - else counter++; + sb.AppendFormat(" {0:X2}", i); } + if(color) + sb.Append("\u001b[0m"); + sb.AppendLine(); - sb.AppendLine(); + + int b = 0; + + string format = $"{{0:X{offsetLength}}}"; + + for(int i = 0; i < rows; i++) + { + if(color) + sb.Append("\u001b[36m"); + + sb.AppendFormat(format, b); + + if(color) + sb.Append("\u001b[0m"); + + sb.Append(" "); + int lastBytes = i == rows - 1 ? last : 16; + int lastSpaces = 16 - lastBytes; + + for(int j = 0; j < lastBytes; j++) + { + sb.AppendFormat(" {0:X2}", array[b]); + b++; + } + + for(int j = 0; j < lastSpaces; j++) + sb.Append(" "); + + b -= lastBytes; + sb.Append(" "); + + for(int j = 0; j < lastBytes; j++) + { + int v = array[b]; + sb.Append(v > 31 && v < 127 || v > 159 ? (char)v : '.'); + b++; + } + + sb.AppendLine(); + } return sb.ToString(); }