Last active
August 21, 2021 07:19
-
-
Save rqx110/c586ce10a28c8f871d27167be6be2c31 to your computer and use it in GitHub Desktop.
hex dump
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static void Main(string[] args) | |
{ | |
var buffer = g().ToArray(); | |
Console.WriteLine(HexDump(buffer)); | |
IEnumerable<byte> g(){ | |
foreach(var i in Enumerable.Range(0, 256)){ | |
yield return (byte)i; | |
} | |
} | |
} | |
public static string HexDump(byte[] bytes, int bytesPerLine = 16) | |
{ | |
if (bytes == null) return "<null>"; | |
int bytesLength = bytes.Length; | |
char[] HexChars = "0123456789ABCDEF".ToCharArray(); | |
int firstHexColumn = | |
8 // 8 characters for the address | |
+ 3; // 3 spaces | |
int firstCharColumn = firstHexColumn | |
+ bytesPerLine * 3 // - 2 digit for the hexadecimal value and 1 space | |
+ (bytesPerLine - 1) / 8 // - 1 extra space every 8 characters from the 9th | |
+ 2; // 2 spaces | |
int lineLength = firstCharColumn | |
+ bytesPerLine // - characters to show the ascii value | |
+ Environment.NewLine.Length; // Carriage return and line feed (should normally be 2) | |
char[] line = (new String(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray(); | |
int expectedLines = (bytesLength + bytesPerLine - 1) / bytesPerLine; | |
StringBuilder result = new StringBuilder(expectedLines * lineLength); | |
for (int i = 0; i < bytesLength; i += bytesPerLine) | |
{ | |
line[0] = HexChars[(i >> 28) & 0xF]; | |
line[1] = HexChars[(i >> 24) & 0xF]; | |
line[2] = HexChars[(i >> 20) & 0xF]; | |
line[3] = HexChars[(i >> 16) & 0xF]; | |
line[4] = HexChars[(i >> 12) & 0xF]; | |
line[5] = HexChars[(i >> 8) & 0xF]; | |
line[6] = HexChars[(i >> 4) & 0xF]; | |
line[7] = HexChars[(i >> 0) & 0xF]; | |
int hexColumn = firstHexColumn; | |
int charColumn = firstCharColumn; | |
for (int j = 0; j < bytesPerLine; j++) | |
{ | |
if (j > 0 && (j & 7) == 0) hexColumn++; | |
if (i + j >= bytesLength) | |
{ | |
line[hexColumn] = ' '; | |
line[hexColumn + 1] = ' '; | |
line[charColumn] = ' '; | |
} | |
else | |
{ | |
byte b = bytes[i + j]; | |
line[hexColumn] = HexChars[(b >> 4) & 0xF]; | |
line[hexColumn + 1] = HexChars[b & 0xF]; | |
line[charColumn] = (b < 32 || b >= 127 ? '·' : (char)b); | |
} | |
hexColumn += 3; | |
charColumn++; | |
} | |
result.Append(line); | |
} | |
return result.ToString(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment