Consider code like this:
#include <iostream>
#include <sstream>
int main()
{
std::stringstream ss;
ss << "a0 b1";
uint8_t byte;
ss >> std::hex >> byte;
std::cout << std::hex << byte << std::endl;
return 0;
}
Why does this output a
instead of a0
even though a0
fits in uint8_t
as hex?
Because uint8_t
is also (probably) unsigned char
, for which special rules exist when you perform formatted extraction from a C++ stream.
Unfortunately this is just an alias, not a distinct type.
Basically it's skipping the "lexically convert to a number" step because it thinks you want to pull out a character. The character 'a'
.
I think you'll want to read into an unsigned int
then downsize if needed.
If you do downsize to a uint8_t
, you're also going then to have to promote it back to a larger int (lol) for much the same reason, to trigger serialisation.
To be honest I'd just avoid the small fixed-width types when dealing with streams (unless you're doing unformatted work with read()
and write()
). It's too easy to forget about this problem.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With