// /*************************************************************************** // Aaru Data Preservation Suite // ---------------------------------------------------------------------------- // // Filename : PrintHex.cs // Author(s) : Natalia Portillo // // Component : Helpers. // // --[ Description ] ---------------------------------------------------------- // // Prints a byte array as hexadecimal. // // --[ License ] -------------------------------------------------------------- // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 2.1 of the // License, or (at your option) any later version. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, see . // // ---------------------------------------------------------------------------- // Copyright © 2011-2020 Natalia Portillo // ****************************************************************************/ using System.Text; using Aaru.Console; namespace Aaru { public static class PrintHex { /// Prints a byte array as hexadecimal values to the console /// Array /// Width of line public static void PrintHexArray(byte[] array, int width = 16) => AaruConsole.WriteLine(ByteArrayToHexArrayString(array, width)); /// 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 = 16, bool color = false) { if(array is null) return null; // 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(); if(last > 0) rows++; 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++) { sb.AppendFormat(" {0:X2}", i); } if(color) sb.Append("\u001b[0m"); 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(); } } }