меня смущает вывод следующего кода:
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
так что я экспериментировал с этим, когда столкнулся с этой проблемой. Я все еще не могу определить, какой метод лучше всего подходит для этого, поэтому, если вы считаете, что то, что я делаю, неэффективно или не нужно, я был бы признателен, если бы знал, почему Спасибо за чтение,
ss >> x
рассматривает uint8_t x как неподписанный символ Значение ascii для ‘4’ равно (десятичному) 52. Он читает первый символ строки «4a» в x, как если бы x был символом. Когда вы переключаете его на uint16_t, он обрабатывается как тип беззнакового короткого целого числа. То же самое с y.
Других решений пока нет …