# encoding: ascii
# api: powershell
# title: Get-HexDump
# description: Fixed
# version: 0.1
# type: function
# author: greg zakharov
# license: CC0
# function: Get-HexDump
# x-poshcode-id: 4593
# x-archived: 2016-05-29T07:49:47
# x-published: 2016-11-08T04:34:00
#
#
#requires -version 2.0
Set-Alias od Get-HexDump

function Get-HexDump {
  [CmdletBinding(DefaultParameterSetName="FileName", SupportsShouldProcess=$true)]
  param(
    [Parameter(Mandatory=$true,
               Position=0,
               ValueFromPipeline=$true)]
    [ValidateNotNullOrEmpty()]
    [String]$FileName,
    
    [Parameter(Mandatory=$false,
               Position=1)]
    [ValidateRange(0, 65535)]
    [Int32]$BytesToProcess = -1
  )
  
  begin {
    $ofs = ''
    [Int32]$line = 0
  }
  process {
    switch ((Test-Path $FileName)) {
      $true{
        if ($PSCmdlet.ShouldProcess($FileName, "Get hex dump of")) {
          gc -ea 0 -enc Byte $FileName -re 16 -to $BytesToProcess | % {
            '{0:X8} {1, -49} {2}' -f $line++, [String](
              $_ | % {' ' + ('{0:x}' -f $_).PadLeft(2, "0")}
            ), [String](
              $_ | % {
                if ([Char]::IsLetterOrDigit($_) -or [Char]::IsSymbol($_) `
                  -or [Char]::IsPunctuation($_)) {[Char]$_}
                else {'.'}
              }
            )
          }
        }
      }
      default{Write-Warning "file not found or does not exist."}
    }
  }
  end {}
}
