Udit Gupta
Udit Gupta

Reputation: 3272

Transform hexadecimal information to binary using a Linux command

I have this binary file on my Linux system...

 udit@udit-Dabba ~ $ cat file.enc
 Salted__s�bO��<0�F���Jw!���]�:`C�LKȆ�l

Using the hexdump command, I see its information like this:

 udit@udit-Dabba ~ $ hexdump -C file.enc
 00000000  53 61 6c 74 65 64 5f 5f  1b 73 a1 62 4f 15 be f6  |Salted__.s.bO...|
 00000010  3c 30 cc 46 ee 10 13 11  84 bf 4a 77 21 a4 84 99  |<0.F......Jw!...|
 00000020  0e 5d ef 11 18 3a 60 43  a0 4c 4b 1e c8 86 e6 6c  |.]...:`C.LK....l|
 00000030

Now I am given a file on some other system whose contents are like this:

 53 61 6c 74 65 64 5f 5f  1b 73 a1 62 4f 15 be f6
 3c 30 cc 46 ee 10 13 11  84 bf 4a 77 21 a4 84 99
 0e 5d ef 11 18 3a 60 43  a0 4c 4b 1e c8 86 e6 6c

And I need to find out that same exact binary information from this hexdump.

How can I proceed for that?

If there isn't any switch for that then C code will also work fine.

(But a Linux command with some switch is preferable)

Limitation:

The binary information in the file is output of an encryption algorithm, so contents should exactly match...

Upvotes: 138

Views: 191493

Answers (2)

Python stdlib solution

If for some unfathomably enterprisey reason you can't sudo apt install xxd, it is easy to reimplement it in Python as per: How to create python bytes object from long hex string? with:

xxd2() ( python -c "import sys;import fileinput;sys.stdout.buffer.write(bytes.fromhex(''.join(fileinput.input(sys.argv[1:]))))" "$@" )

which works both with files and stdin:

printf 01ab | xxd2 
printf '01 ab' | xxd2

or:

printf 01ab > myfile.hex
xxd2 myfile.hex

Here's the script with better indentation:

import sys
import fileinput
sys.stdout.buffer.write(
    bytes.fromhex(
        ''.join(
            fileinput.input(sys.argv[1:])
        )
    )
)

The bytes.fromhex function ignores whitespaces and newlines since Python 3.7, so it works regardless of the indentation details of the format, as per docs: https://docs.python.org/3.12/library/stdtypes.html#bytes.fromhex

Changed in version 3.7: bytes.fromhex() now skips all ASCII whitespace in the string, not just spaces.

Tested on Python 3.12.3, Ubuntu 24.04.

Upvotes: 1

Adam Rosenfield
Adam Rosenfield

Reputation: 400146

As @user786653 suggested, use the xxd(1) program:

xxd -r -p input.txt output.bin

Upvotes: 244

Related Questions