Почему чтение uint8_t как hex не работает, как ожидалось? - PullRequest
7 голосов
/ 04 июня 2019

Рассмотрим код, подобный следующему:

#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;
}

Почему этот вывод a вместо a0, хотя a0 вписывается в uint8_t как шестнадцатеричное?

1 Ответ

12 голосов
/ 04 июня 2019

Поскольку uint8_t также (вероятно) unsigned char, для которого существуют специальные правила при выполнении форматированного извлечения из потока C ++.

К сожалению это просто псевдоним, а не отдельный тип .

По сути, он пропускает шаг "лексическое преобразование в число", потому что думает, что вы хотите вытащить символ.Символ 'a'.

Я думаю, вы захотите прочитать в unsigned int, а затем при необходимости уменьшить его.

Если вы уменьшите размер до uint8_t, вы такжеЗатем мне придется повысить его до большего целого (смеется) по по той же причине , чтобы запустить сериализацию.

( live demo )

Если честно, я бы просто избегал небольших типов фиксированной ширины при работе с потоками (если только вы не выполняете неформатированную работу с read() и write()).Об этой проблеме слишком легко забыть.

...