Для чтения и записи двоичных данных в потоки, включая строковые потоки, используйте функции-члены read () и write (). Так
unsigned char a(1), b(2), c(3), d(4);
std::stringstream s;
s.write(reinterpret_cast<const char*>(&a), sizeof(unsigned char));
s.write(reinterpret_cast<const char*>(&b), sizeof(unsigned char));
s.write(reinterpret_cast<const char*>(&c), sizeof(unsigned char));
s.write(reinterpret_cast<const char*>(&d), sizeof(unsigned char));
s.read(reinterpret_cast<char*>(&v), sizeof(unsigned int));
std::cout << std::hex << v << "\n";
Это дает 0x4030201
в моей системе.
Edit:
Чтобы сделать это прозрачным с помощью операторов вставки и извлечения (<< и >>), лучше всего создать производный потоковый буфер, который делает правильные вещи, и передать его любым потокам, которые вы хотите использовать.