I was wondering if "." could change in some way the content of the two buffers. Since it's string concatenation operator, I was worried that some sort of "stringification" of the two buffers could change them some way (this is why I asked if there's a way to concat two binary buffers). I am still not sure about this.
Perl's strings are "8-bit-clean". You can store binary data in them, and you can use all string operators on them, even if you consider your data binary. Stringification does not happen here, because for Perl, the data is already a string.
Regarding the size of the read data: I am actually trying to put back together some stripes from a dead raid array, so if I am not able to read exactly $bufsize bytes I'd better die away asap :)
Consider using dd conv=noerror, dd_rescue or ddrescue instead of Perl. If you care about your data, don't touch it and pay experts to rescue the data.
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)