stream — stringstream & gt; & gt; uint8_t в шестнадцатеричном? Переполнение стека

меня смущает вывод следующего кода:

uint8_t x = 0, y = 0x4a;
std::stringstream ss;
std::string a = "4a";ss << std::hex << a;
ss >> x;

std::cout << (int)x << " "<< (int)y << std::endl;
std::cout << x << " "<< y <<std::endl;
std::cout << std::hex << (int)x <<  " " << (int)y << std::endl;

uint8_t z(x);
std::cout << z;

выход для вышеупомянутого:

52 74

4 Дж

34 4а

4

и когда мы изменим, замените первую строку на:

uint16_t x = 0, y = 0x4a;

выход превращается в:

74 74

74 74

4а 4а

J

Я думаю, что понимаю, что происходит, но я не понимаю, почему это происходит или как я могу предотвратить это / обойти это. Из моего понимания std::hex модификатор как-то подорван из-за типа xВозможно, это не совсем так на техническом уровне, но он просто пишет первый прочитанный символ.

Справочная информация: Предполагается, что входные данные представляют собой строку шестнадцатеричных цифр, каждая пара представляет байт (как растровое изображение, кроме строки). Я хочу иметь возможность прочитать каждый байт и сохранить его в uint8_t так что я экспериментировал с этим, когда столкнулся с этой проблемой. Я все еще не могу определить, какой метод лучше всего подходит для этого, поэтому, если вы считаете, что то, что я делаю, неэффективно или не нужно, я был бы признателен, если бы знал, почему Спасибо за чтение,

4

Решение

ss >> x

рассматривает uint8_t x как неподписанный символ Значение ascii для ‘4’ равно (десятичному) 52. Он читает первый символ строки «4a» в x, как если бы x был символом. Когда вы переключаете его на uint16_t, он обрабатывается как тип беззнакового короткого целого числа. То же самое с y.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]