Search code examples
printfxxd

Issues converting a small Hex value to a Binary value


I am trying to take the contents of a file that has a Hex number and convert that number to Binary and output to a file.

This is what I am trying but not getting the binary value:

    xxd -r -p Hex.txt > Binary.txt

The contents of Hex.txt is: ff

I have also tried FF and 0xFF, but would like to just use ff since the device I am pulling the info from has it in that format.

Instead of 11111111 which it should be, I get a y with 2 dots above it.

If I change it to ee, I get an i with 2 dots. It seems to be reading it just fine but according to what I have read on the xxd -r -p command, it is not outputing it in the correct format.

The other ways I have found to convert Hex to Binary have either also not worked or is a pretty big Bash script that seems unnecessary to do what I thought would be a simple task.

This also gives me the y with 2 dots.

    $ for i in $(cat Hex.txt) ; do printf "\x$i" ; done > Binary.txt

For some reason almost every solution I find gives me this format instead of a human readable Binary value with 1s and 0s.

Any help is appreciated. I am planning on using this in a script to pull the Relay values from Digital Loggers devices using curl and giving Home Assistant a readable file to record the Relay State. Digital Loggers curl cmd gives the state of all 8 relays at once using Hex instead of being able to pull the status of a specific relay.


Solution

  • If "file.txt" contains:

    fe
    0a
    

    and you run this:

    perl -ane 'printf("%08b\n",hex($_))' file.txt
    

    You'll get this:

    11111110
    00001010
    

    If you use it a lot, you might want to make a bash function of it in your login profile along these lines - being extremely respectful of spaces and semi-colons that might look unnecessary:

    bin(){ perl -ane 'printf("%08b\n",hex($_))' $1 ; }
    

    Then you'll be able to do:

    bin file.txt
    

    If you dislike Perl for some reason, you can achieve something similar without it as follows:

    tr '[:lower:]' '[:upper:]' < file.txt |
       while read h ; do
          echo "obase=2; ibase=16; $h" | bc
       done