In UNIX/Linux/whatever there is this little utility called ‘od’ which makes it trivial to dump the output of a file in multiple formats.
Yesterday, I was working on a project and needed something similar. I could’ve downloaded Cygwin and installed it, or UnixUtils from Sourceforge, but no – I decided to write a PowerShell routine to give me what I needed.
If you’ve never had the need to see hexadecimal, alphanumeric, and decimal information on a file all at once, well, move along now!
Otherwise, below is my solution for your benefit. A couple of interesting points are my use of System.Char methods to determine whether a character is printable (viewable) and my use of the format operator (-f) which uses System.Format.
Many attributes in Active Directory (including many Exchange and DNS related attributes) have a raw form that devolves into a System.Byte[] array (or an array of System.Byte[] arrays). You can get an arbitrary file as a byte array by using the Get-Content cmdlet with the “-Encoding Byte” parameter.
Here is example output (with a line of header information that isn’t from this routine):
dNSRecord contains 62 rows of type System.Byte[] from DC=_gc._tcp.E14-Site._sites,DC=essential.local,CN=MicrosoftDNS,CN=System,DC=essential,DC=local Array contains 62 entries 26 00 21 00 05 f0 00 00 d7 &.!..ð... 38 0 33 0 5 240 0 0 215 07 00 00 00 00 02 58 00 00 ......X.. 7 0 0 0 0 2 88 0 0 00 00 ac 9a 36 00 00 00 00 ....6.... 0 0 172 154 54 0 0 0 0 64 0c c4 1e 03 0c 77 69 6e d.Ä...win 100 12 196 30 3 12 119 105 110 32 30 30 38 2d 64 63 2d 33 2008-dc-3 50 48 48 56 45 100 99 45 51 09 65 73 73 65 6e 74 69 61 .essentia 9 101 115 115 101 110 116 105 97 6c 05 6c 6f 63 61 6c 00 l.local. 108 5 108 111 99 97 108 0
And without further ado:
function dumpByteArray([System.Byte[]]$array, [int]$width = 9)
{
$hex = ""
$chr = ""
$int = ""
$i = $array.Count
"Array contains {0} elements" -f $i
$index = 0
$count = 0
while ($i-- -gt 0)
{
$val = $array[$index++]
$hex += ("{0} " -f $val.ToString("x2"))
if ([char]::IsLetterOrDigit($val) -or
[char]::IsPunctuation($val) -or
([char]$val -eq " "))
{
$chr += [char]$val
}
else
{
$chr += "."
}
$int += "{0,4:N0}" -f $val
$count++
if ($count -ge $width)
{
"$hex $chr $int"
$hex = ""
$chr = ""
$int = ""
$count = 0
}
}
if ($count -gt 0)
{
if ($count -lt $width)
{
$hex += (" " * (3 * ($width - $count)))
$chr += (" " * (1 * ($width - $count)))
$int += (" " * (4 * ($width - $count)))
}
"$hex $chr $int"
}
}
Until next time…
If there are things you would like to see written about, please let me know!
Follow me on twitter: @EssentialExch
