Occasionally I need to get the hexadecimal representation of a file so I can specify it as the value of a VarBinary variable in SQL Server for testing.
You can do this in two lines with powershell:
> get-content -Encoding byte yourfile.txt | %{ "{0:x}" -f $_ } | %{ if ( $_.Length -eq 1 ) { $out = $out + 0 + $_ } else { $out = $out + $_ } }
> $out
> $out
The first part:
get-content -Encoding byte yourfile.txt
Outputs the file's contents as bytes.The second part:
| %{ "{0:x}" -f $_ }
Converts the bytes to hexadecimal representation.The last part:
| %{ if ( $_.Length -eq 1 ) { $out = $out + 0 + $_ } else { $out = $out + $_ } }
Corrects any single hex character values so that they display preceded by a 0 and concatenates them into a string so that they you can output them all on a single line.Anyone know of any ways to shorten this script up?
Here's a shorter command:
ReplyDeletegc -en byte file.txt | % { '{0:X2}' -f $_ } | Join-String
If you use it a lot:
function Format-HexString {
param([string[]]$path)
gc -en byte $path | % { '{0:X2}' -f $_ } | Join-String
}
New-Alias fhs Format-HexString
fhs file.txt
You've gotta love PowerShell! :-)
Very cool!
ReplyDeleteI didn't know about the X2 trick to automatically pad the digits, that's great.
But I see that Join-String doesn't come with Powershell. You have to install the Powershell Community Extensions: http://www.codeplex.com/PowerShellCX
Thanks for the tip!
Oups, I always run with PSCX installed, so I didn't remember Join-String isn't a standard cmdlet. Anyway, if you for some reason cannot install PSCX, you can easily create a replacement:
ReplyDeletefunction Join-String {
begin {
$sb = New-Object System.Text.StringBuilder
}
process {
$sb.Append($_) | Out-Null
}
end {
$sb.ToString()
}
}
Hope it's of any use!