Получение значения byte с помощью stringstream
У меня есть этот (неправильный) пример кода для получения значения из stringstream и хранения его в переменной размера байта (он должен быть в одном байте var, а не int):
#include <iostream>
#include <sstream>
using namespace std;
int main(int argc, char** argv)
{
stringstream ss( "1" );
unsigned char c;
ss >> c;
cout << (int) c << endl;
}
вывод, когда я запускаю это, - 49, что не то, что я хотел бы видеть. Очевидно, что это рассматривается как символ, а не простое числовое значение. Каков самый c++ - способ заставить c удерживать 1, а не 49 при приведении к int?
спасибо!
5 ответов
самый C++ - ish способ, безусловно,анализировать значение правильно, прочитав в другой интегральный тип, и затем приведение к типу байта (начиная с чтения в char
никогда не будет разбирать – он всегда будет просто читать следующий символ):
typedef unsigned char byte_t;
unsigned int value;
ss >> value;
if (value > numeric_limits<byte_t>::max()) {
// Error …
}
byte_t b = static_cast<byte_t>(value);
я использовал unsigned int
так как это наиболее естественно, хотя unsigned short
конечно, работа.
символ всегда будет делать это. Вам нужно прочитать int (или float или double и т. д.), Иначе будет вызван неправильный "форматер".
unsigned char c;
unsigned int i;
ss >> i;
c = i;
stringstream ss( "1" );
unsigned char c;
{
unsigned int i;
ss >> i;
c = i;
}
cout << static_cast<int>(c) << endl;
будет работать. Вы также можете сделать некоторые небезопасные вещи указателя, но я бы просто пошел с вышеизложенным.
это потому, что строковые константы в C++ рассматриваются как текст.
Два варианта:
-
Закодируйте строку, используя экранированные числа:
- Восьмеричные числа: \0
{1,3} - шестнадцатеричные числа: \0x
{2}
std:: stringstream( "\01\02\03\04\0xFF");
- Восьмеричные числа: \0
-
или построить массив символов и инициализировать его с помощью чисел:
данных char[] = { 0, 1, 2,3 ,4, 255 };
Как насчет:
#include <iostream>
#include <sstream>
using namespace std;
int main(int argc, char** argv)
{
char x[] = {1,0};
stringstream ss( x);
unsigned char c;
ss >> c;
cout << (int) c << endl;
}