Получение значения 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;

вычесть '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++ рассматриваются как текст.
Два варианта:

  • Закодируйте строку, используя экранированные числа:

    • Восьмеричные числа: \0 {1,3}
    • шестнадцатеричные числа: \0x {2}

    std:: stringstream( "\01\02\03\04\0xFF");

  • или построить массив символов и инициализировать его с помощью чисел:

    данных 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;
}