Получение байтового значения с использованием stringstream - PullRequest
6 голосов
/ 28 июля 2010

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

10 голосов
/ 28 июля 2010

Самый простой способ 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, конечно, также будет работать.

3 голосов
/ 28 июля 2010

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

unsigned char c;
unsigned int i;
ss >> i;
c = i;
2 голосов
/ 28 июля 2010

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

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

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

0 голосов
/ 29 июля 2010

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

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

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

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

  • Или создайте массив char и инициализируйте его, используя числа:

    char 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;
}
0 голосов
/ 28 июля 2010
stringstream ss( "1" );
unsigned char c;
{
    unsigned int i;
    ss >> i;
    c = i;
}
cout << static_cast<int>(c) << endl;

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

...