Search code examples
powershellhexbinaryfilesbin

How to convert Hex string with address and ASCII values to binary file using Powershell?


I have a file with this content:

00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 2D 13 2D 13 00 00 00 00   ........-.-.....
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................

I would like to create .bin file with with content. I tried this way:

$bytes = [byte]0xFF 
Set-Content -Path .\content.bin -Value $bytes -Encoding Byte

It created the bin file but when I try to check the hex with this way:

Format-Hex .\content.bin

It return this output:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   FF 

My expectation result supposed to be like this:

    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 2D 13 2D 13 00 00 00 00   ........-.-.....
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
    00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................

Anyone can give idea please. Thanks a lot.


Solution

  • Going by your comment I want to convert the hex to .bin file.

    There are many applications that can do a hexdump of a binary file. PowerShell has the Format-Hex cmdlet for that, but it doesn't create output as you show in your question.
    Format-Hex starts with a byte count header line

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

    then an empty line and after that the hex data. It also adds a byte counter left margin before the actual data.

    Your example doesnt do that, but instead adds a hyphen in between every eight bytes, so it is obviously not created using Format-Hex.

    Anyway, here's how you can recreate a binary file from both types of hexdump output:

    $inputFile  = 'D:\Test\yourHexdump.txt'
    $outputFile = 'D:\Test\yourBinaryFile.bin'  # use absolute full path here
    # if the output file already exists, delete it
    if (Test-Path -Path $outputFile -PathType Leaf) { Remove-Item -Path $outputFile -Force }
    
    # create a FileStream object to write the converted bytes to file
    $stream = [System.IO.FileStream]::new($outputFile, [System.IO.FileMode]::Append, [IO.FileAccess]::Write)
    
    # now loop through the file line-by-line and parse out the bytes
    switch -Regex -File $inputFile {
        # if this is from Format-Hex output, ignore the 1-16 byte header and empty line(s)
        '^\s+00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F|^\s*$' {}  
        default { 
            # if this is from Format-Hex output, remove the byte counters in the left margin
            $line = if ($_ -match '^[0-9A-f]{8}\s') { $_.Substring(8) } else { $_ }
            # convert the hex values into an array of bytes
            [byte[]]$bytes = (($line.TrimStart() -split '\s{2,}')[0].Trim() -replace '-' -split '\s+' -ne '' -replace '^', '0X')
            # write to file
            $stream.Write($bytes, 0, $bytes.Count)
        }
    }
    # dispose of the stream
    $stream.Flush()     # probably Dispose() also flushes..
    $stream.Dispose()