FWIW, it's actually pretty likely that a vector<char>'s buffer will actually be aligned in practice, because it is almost certainly allocated using malloc() which always returns aligned buffers. But, there's technically no guarantee.
Given this, perhaps you could write some code which *checks* for alignment, and if so, does a reinterpret_cast, but if the buffer isn't aligned, then it falls back to a copy.
bool aligned = reinterpret_cast<uintptr_t>(bytes.begin()) % sizeof(void*) == 0;
(I use sizeof(void*) as the denominator because 32-bit systems usually require only 32-bit alignment even for 64-bit data types.)
-Kenton