If you want to convert a program to hexdecimal or binary out, here is two programs to do so.
First get your pre-reqs:
apt-get update apt-get install python apt-get install pip pip install bitstring
Note: these programs would work outside of linux, just need to make sure you have the bitstring python module installed.
EXAMPLE OUTPUT
Imagine a source file, that will be our input file for the tohex/tobin programs, that looks like this:
text1 text2
binary output:
Converting to BINARY Reading in test.txt *** START *** 011101000110010101111000011101000011000100001010011101000110010101111000011101000011001000001010 *** THE END ***<span style="font-family: Lato, sans-serif; font-size: 16px; line-height: 1.5; background-color: #ffffff;"> </span>
hexadecimal output:
Converting to HEXADECIMAL / HEX Reading in test.txt *** START *** 74657874310a74657874320a *** THE END ***
SIMPLE PROGRAMS
Now here is a simple version of converting to hex:
#!/bin/bash
# usage: ./tohex-simple.py <filename>
# converts filename to hex/hexidecimal output
import bitstring
import os.path
import sys
INPUTFILE = sys.argv[1]
BSTREAM = bitstring.ConstBitStream(filename=INPUTFILE)
BS = 8 # blocksize in bits, reading the file in packets of <BS> bit chunks
try:
while True:
BPACKET = BSTREAM.read(BS) ## READ IN BLOCKSIZE (in bits)
sys.stderr.write(BPACKET.hex) ### prints BS_NUM bits in hex at a time
except bitstring.ReadError:
pass
And here is the simple version of converting to binary:
#!/bin/bash
# usage: ./tobin-simple.py <filename>
# converts filename to binary output
import bitstring
import os.path
import sys
INPUTFILE = sys.argv[1]
BSTREAM = bitstring.ConstBitStream(filename=INPUTFILE)
BS = 8 # blocksize in bits, reading the file in packets of <BS> bit chunks
try:
while True:
BPACKET = BSTREAM.read(BS) ## READ IN BLOCKSIZE (in bits)
sys.stderr.write(BPACKET.bin) ### prints BS_NUM bits in hex at a time
except bitstring.ReadError:
pass
BLOCKSIZE INFO
Note about blocksize: the blocksize, BS, is set to 4096, I find thats a good amount to read in while keeping the program fast. I converted a 1MB file in a tenth of a second with blocksize of 4096 bits, but it took 4 seconds with a block size of 128 bits, and 17 seconds with a 32 bit block size. Reading in a byte at a time (blocksize is 8 bits) took 44 seconds to process the 1MB file.
Caveat: Had to drop the block size to 8, which is the size of a byte, or else this wouldn’t work on inputfiles that are less than the blocksize in size (as a ReadError would incur). Likewise for files that are not even blocksize integer size will get truncated at blocksize integers. With setting block size to 8 we fix that problem at the cost of performance
THE REAL PROGRAMS
Now if you want a fancy program, that can have helpful info, and print on the desktop pretty and can handle errors, then use the programs below.
Hexadecimal / hex version:
#!/usr/bin/python
### EXTRACTS HEX DATA AND PRINTS TO FILE ###
### stdout prints output can be saved to file###
### stderr prints info text, and newlines to pretty output ###
import bitstring
import os.path
import sys
__author__ = 'infotinks' ## optional line
def werr(txt): # write error - print to stderr
sys.stderr.write(txt)
def wout(txt): # print without newline - print to stdout
sys.stdout.write(txt)
def main(filename): # parse the file
f = filename
needfinalnewline=False # for printing newline on a special case (when stderr is redirect but stdout is not)
bs = 8 # blocksize in bits, reading the file in packets of 128 BIT chunks
werr("Converting to HEXADECIMAL / HEX\n")
werr("Reading in %s\n" % f)
if os.path.isfile(f):
pass
else:
werr("ERROR: %s is not a file (or doesnt exist)\n" % f)
return -1
werr("*** START ***\n")
bstream = bitstring.ConstBitStream(filename=f)
try:
while True:
bpacket = bstream.read(bs) ## READ IN BLOCKSIZE (in bits)
if sys.stdout.isatty(): # stdout not redir but going to terminal so write to error so that order on screen looks correct (or else all stderr output is at the top)
if sys.stderr.isatty():
werr(bpacket.hex) ### *** MAIN OUTPUT ***
else:
wout(bpacket.hex) ### *** MAIN OUTPUT ***
needfinalnewline = True
else: # stdout is being redirected, so write to it
wout(bpacket.hex)
except bitstring.ReadError:
pass
if needfinalnewline: # prints a newline at end, if all error output is redirected to a different file
wout("\n")
else:
if sys.stdout.isatty(): # not redirected print like this so pretty
werr("\n*** THE END ***\n")
else: # stdout is being redirected so remove first newline to make pretty
werr("*** THE END ***\n")
### THE START OF THE PROGRAM ###
try:
file = sys.argv[1]
except:
werr("*** Converts file to HEX ***\n")
werr("ERROR: Need to give inputfile filename\n")
werr("usage: %s inputfile\n" % sys.argv[0])
werr("usage: %s inputfile > outputfile\n" % sys.argv[0])
werr("usage: %s inputfile 2> /dev/null\n" % sys.argv[0])
else:
try:
main(file)
except KeyboardInterrupt:
werr("\n*** CANCELLED or ERROR ***\n")
Binary version:
#!/usr/bin/python
### EXTRACTS BINARY DATA AND PRINTS TO FILE ###
### stdout prints output can be saved to file###
### stderr prints info text, and newlines to pretty output ###
import bitstring
import os.path
import sys
__author__ = 'infotinks' ## optional line
def werr(txt): # write error - print to stderr
sys.stderr.write(txt)
def wout(txt): # print without newline - print to stdout
sys.stdout.write(txt)
def main(filename): # parse the file
f = filename
needfinalnewline=False # for printing newline on a special case (when stderr is redirect but stdout is not)
bs = 8 # blocksize in bits, reading the file in packets of 128 BIT chunks
werr("Converting to BINARY\n")
werr("Reading in %s\n" % f)
if os.path.isfile(f):
pass
else:
werr("ERROR: %s is not a file (or doesnt exist)\n" % f)
return -1
werr("*** START ***\n")
bstream = bitstring.ConstBitStream(filename=f)
try:
while True:
bpacket = bstream.read(bs) ## READ IN BLOCKSIZE (in bits)
if sys.stdout.isatty(): # stdout not redir but going to terminal so write to error so that order on screen looks correct (or else all stderr output is at the top)
if sys.stderr.isatty():
werr(bpacket.bin) ### *** MAIN OUTPUT ***
else:
wout(bpacket.bin) ### *** MAIN OUTPUT ***
needfinalnewline = True
else: # stdout is being redirected, so write to it
wout(bpacket.bin)
except bitstring.ReadError:
pass
if needfinalnewline: # prints a newline at end, if all error output is redirected to a different file
wout("\n")
else:
if sys.stdout.isatty(): # not redirected print like this so pretty
werr("\n*** THE END ***\n")
else: # stdout is being redirected so remove first newline to make pretty
werr("*** THE END ***\n")
### THE START OF THE PROGRAM ###
try:
file = sys.argv[1]
except:
werr("*** Converts file to BINARY ***\n")
werr("ERROR: Need to give inputfile filename\n")
werr("usage: %s inputfile\n" % sys.argv[0])
werr("usage: %s inputfile > outputfile\n" % sys.argv[0])
werr("usage: %s inputfile 2> /dev/null\n" % sys.argv[0])
else:
try:
main(file)
except KeyboardInterrupt:
werr("\n*** CANCELLED or ERROR ***\n")
The end.