Tuesday, July 1, 2008

PowerShell: Get File Contents in Hex

I've done this a couple times and thought I'd share.

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


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?

3 comments:

C-J said...

Here's a shorter command:

gc -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! :-)

Kevin Berridge said...

Very cool!

I 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!

C-J said...

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:

function Join-String {
   begin {
      $sb = New-Object System.Text.StringBuilder
   }
   process {
      $sb.Append($_) | Out-Null
   }
   end {
      $sb.ToString()
   }
}

Hope it's of any use!