Получение значения байта с помощью stringstream

У меня есть этот (неправильный) пример кода для того, чтобы вытащить значение из 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, когда литой к интервалу?

Спасибо!

6
задан twk 28 July 2010 в 19:34
поделиться

5 ответов

Наиболее подходящим для 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 будет конечно тоже работаю.

10
ответ дан 8 December 2019 в 17:17
поделиться

Это всегда будет делать символ. Вам нужно прочитать int (или float, или double и т. Д.), Иначе будет вызван неправильный «форматировщик».

unsigned char c;
unsigned int i;
ss >> i;
c = i;
3
ответ дан 8 December 2019 в 17:17
поделиться

Вычтите из него '0' :

cout << (int) (c - '0') << endl;

'0' имеет значение 48, поэтому 49 - 48 = 1

2
ответ дан 8 December 2019 в 17:17
поделиться
stringstream ss( "1" );
unsigned char c;
{
    unsigned int i;
    ss >> i;
    c = i;
}
cout << static_cast<int>(c) << endl;

Будет работать. Вы также можете использовать небезопасные указатели, но я бы просто согласился с вышеизложенным.

0
ответ дан 8 December 2019 в 17:17
поделиться

Это потому, что строковые константы в C ++ обрабатываются как текст.
Два варианта:

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

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

    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;
}
-1
ответ дан 8 December 2019 в 17:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: