There are some interesting ideas here:
http://www.etalabs.net/sh_tricks.html
Especially the "reading input byte-by-byte" which claims that "dd" is the only thing guaranteed to read a single byte, and the inline piping trick. You might also need to mess with the IFS environment var. And where they show "od" you probably need to use "hexdump" instead.
A good place to start anyway...