6

stringstream から値を取得し、それをバイト サイズの変数に格納するためのこの (正しくない) サンプル コードがあります (int ではなく、1 バイトの 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 ですが、これは私が見たいものではありません。明らかに、これは単純な数値ではなく char として扱われます。intにキャストされたときにcに49ではなく1を保持させる最もc++っぽい方法は何ですか?

ありがとう!

4

5 に答える 5

10

最も C++ らしい方法は、別の整数型に読み込むことによって値を適切に解析し、次にバイト型にキャストすることです ( a への読み込み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

于 2010-07-28T19:34:03.020 に答える
3

char は常にそれを行います。int (または float や double など) を読み取る必要があります。そうしないと、間違った「フォーマッタ」が呼び出されます。

unsigned char c;
unsigned int i;
ss >> i;
c = i;
于 2010-07-28T19:32:52.023 に答える
2

それから引き'0'ます:

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

'0'の値は 48 なので、49 - 48 = 1

于 2010-07-28T19:29:04.017 に答える
0
stringstream ss( "1" );
unsigned char c;
{
    unsigned int i;
    ss >> i;
    c = i;
}
cout << static_cast<int>(c) << endl;

動作します。安全でないポインターを実行することもできますが、上記の方法を使用します。

于 2010-07-28T19:35:42.393 に答える
-1

これは、C++ の文字列定数がテキストのように扱われるためです。
2 つのオプション:

  • エスケープされた数字を使用して文字列をエンコードします。

    • 8 進数: \0<d>{1,3}
    • 16 進数: \0x<d>{2}

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

  • または、char の配列を作成し、数値を使用して初期化します。

    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;
}
于 2010-07-28T20:26:12.420 に答える