У меня есть этот (неправильный) пример кода для того, чтобы вытащить значение из stringstream и сохранить его в переменной размера байта (это должно быть в единственном var байта, не интервале):
#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, когда литой к интервалу?
Спасибо!
Наиболее подходящим для C ++ способом является правильно проанализировать значение путем чтения в другой целочисленный тип и , а затем преобразовать в байтовый тип (с момента чтения в 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;
Вычтите из него '0'
:
cout << (int) (c - '0') << endl;
'0'
имеет значение 48, поэтому 49 - 48 = 1
stringstream ss( "1" );
unsigned char c;
{
unsigned int i;
ss >> i;
c = i;
}
cout << static_cast<int>(c) << endl;
Будет работать. Вы также можете использовать небезопасные указатели, но я бы просто согласился с вышеизложенным.
Это потому, что строковые константы в C ++ обрабатываются как текст.
Два варианта:
Кодировать строку, используя экранированные числа:
std :: stringstream ("\ 01 \ 02 \ 03 \ 04 \ 0xFF");
Или создайте массив символов и инициализируйте его числами:
char data [] = {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;
}