test/resource/Get-Bytes.psm1


<#
.SYNOPSIS
Outputs a file's bytes in decimal and/or binary notation

.DESCRIPTION
Initially created to compare files prior to UTF encoding.

.PARAMETER Path
Path to file.

.PARAMETER Format
Possible values are: DecimalOnly, BinaryOnly, Both

.EXAMPLE
C:\> Get-Bytes E:\marckassay\EndOfLine\test\resource\index-UTF8-CRLF-NoXtraLine.html -Format DecimalOnly
60
104
116
109
108
62
13
10

.EXAMPLE
C:\> $Out = Get-Bytes E:\marckassay\EndOfLine\test\resource\index-UTF8-CRLF-NoXtraLine.html -Format Both
C:\> $Out
60 : 00111100
104 : 01101000
116 : 01110100
109 : 01101101
108 : 01101100
62 : 00111110
13 : 00001101
10 : 00001010

.NOTES
General notes
#>

function Get-Bytes {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string[]]$Path,

        [Parameter(Mandatory = $true)]
        [ValidateSet("DecimalOnly", "BinaryOnly", "Both")]
        [string]$Format
    )
    
    # store default Output Field Separator...
    $PRESeparator = $OFS
    $OFS = ''

    if ($Format -eq "DecimalOnly") {
        Get-Item $Path | `
            Get-Content -Raw | `
            ForEach-Object {
            [System.Text.Encoding]::Default.GetBytes($_) 
        } 
    }
    else {
        Get-Item $Path | `
            Get-Content -Raw | `
            ForEach-Object {[System.Text.Encoding]::Default.GetBytes($_)} | `
            ForEach-Object {
            $DecimalByte = $_
            $buffer = [byte[]]::new(8)
            $bufferLength = $buffer.Length - 1

            while ( $bufferLength -ne 0 ) {
                $Q = $DecimalByte % 2
                $buffer[$bufferLength--] = $Q
                $DecimalByte = [Math]::Floor($DecimalByte * .5)
            }

            if ($Format -eq "BinaryOnly") {
                $Output = "$buffer"
            }
            # $Format -eq Both
            else {
                $Output = $_.ToString().PadRight(3) + " : $buffer"
            }
            $Output 
        }
    }

    $OFS = $PRESeparator
}
Export-ModuleMember -Function Get-Bytes