| pid | 107 |
|---|---|
| author | Joel Bennett |
| title | Format-HexString |
| date | 2008-01-09 11:49:01 -0800 |
| format | posh |
| parent | 0 |
Format a byte array as a hexadecimal string
## Format-HexString.ps1
## Format a byte array as a hexadecimal string
##
## Example usage:
## get-content 'c:\windows\Coffee Bean.bmp' -encoding byte | Format-HexString | more
## Convert the input to an array of bytes. This is a strongly-typed variable,
## so that we're not trying to iterate over strings, directory entries, etc.
## [byte[]] $bytes = $(foreach($byte in $input) { $byte })
begin
{
## Store our header, and formatting information
$counter = 0
$header = " 0 1 2 3 4 5 6 7 8 9 A B C D E F"
$nextLine = "{0} " -f [Convert]::ToString($counter, 16).ToUpper().PadLeft(8, '0')
$asciiEnd = ""
## Output the header
"`r`n$header`r`n"
}
process
{
## Display each byte, in 2-digit hexidecimal, and add that to the left-hand
## side.
$nextLine += "{0:X2} " -f $_
## If the character is printable, add its ascii representation to
## the right-hand side. Otherwise, add a dot to the right hand side.
if(($_ -ge 0x20) -and ($_ -le 0xFE))
{
$asciiEnd += [char] $_
}
else
{
$asciiEnd += "."
}
$counter++;
## If we've hit the end of a line, combine the right half with the left half,
## and start a new line.
if(($counter % 16) -eq 0)
{
"$nextLine $asciiEnd"
$nextLine = "{0} " -f [Convert]::ToString($counter, 16).ToUpper().PadLeft(8, '0')
$asciiEnd = "";
}
}
end
{
## At the end of the file, we might not have had the chance to output the end
## of the line yet. Only do this if we didn't exit on the 16-byte boundary,
## though.
if(($counter % 16) -ne 0)
{
while(($counter % 16) -ne 0)
{
$nextLine += " "
$asciiEnd += " "
$counter++;
}
"$nextLine $asciiEnd"
}
""
}