Tell me more ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I'm trying to find two bytes inside binary file, then increase value of those two bytes and replace them inside file. Those two bytes are on positions 0x82-0x83. For now on I have successfully extracted those two bytes using this:

#!/usr/bin/env bash
BYTES=$(tail -c +131 "$1" | head -c 2)

Those bytes have value: 1B 1F. I'm stuck with:

  1. How to convert bytes to integer? It should be 6943 decimal.
  2. How to append / echo binary data to file
  3. How to write increased bytes inside file on positions 0x82-0x83. I could use head -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin, but there must be better way.

I could do that in PHP, it should be easier, but I'm interested how to do this in bash.

share|improve this question
add comment

2 Answers

up vote 4 down vote accepted

Testing with this file:

$ echo hello world > test.txt
$ echo -n $'\x1b\x1f' >> test.txt
$ echo whatever >> test.txt
$ hexdump -C test.txt 
00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 1b 1f 77 68  |hello world...wh|
00000010  61 74 65 76 65 72 0a                              |atever.|
$ grep -a -b --only-matching $'\x1b\x1f' test.txt 
12:

So in this case the 1B 1F is at position 12.

  • Convert to integer (there is probably an easier way)

    $ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt`  | bc
    6943
    
  • And the reverse:

    $ printf '%04X' 6943 | xxd -r -ps | hexdump -C
    00000000  1b 1f                                             |..|
    $ printf '%04X' 4242 | xxd -r -ps | hexdump -C
    00000000  10 92                                             |..|
    
  • And putting it back in the file:

    $ printf '%04X' 4242 | xxd -r -ps | dd of=test.txt bs=1 count=2 seek=12 conv=notrunc
    2+0 records in
    2+0 records out
    2 bytes (2 B) copied, 5.0241e-05 s, 39.8 kB/s
    
  • Result:

    $ hexdump -C test.txt
    00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 10 92 77 68  |hello world...wh|
    00000010  61 74 65 76 65 72 0a                              |atever.|
    
share|improve this answer
 
Yes, It's exactly what I was looking for. Thanks. –  piotrekkr Aug 30 at 13:11
 
@frostschutz: There is a bug —a missing \x— in line two of your example code. It should be echo -n $'\x1b\x1f' >> test.txt. –  erik Aug 30 at 20:07
add comment

Oh, sorry. This answer is obsolete, because I thought you have hexadecimal values written as ascii in your file.


You can convert the hex numbers to decimal system via printf "%d" 0x1B1F.

If you have saved the bytes in a variable BYTES=1B1F then you get the result with printf "%d" 0x$BYTES.

So, if you want to increase the number do

$ echo $(($(printf "%d" 0x$BYTES) +1))
6944

Then convert it back

printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.