0

16 進文字列 (0x1) を uint8 に変換するときに結果が 0 になる理由を知りたいです。

使用しようとしましboost::lexical_castたが、bad_lexical_cast例外が発生します。したがって、stringstream代わりに a を使用することにしましたが、間違った値を取得しています。

...
uint8_t temp;
std::string address_extension = "0x1";
std::cout << "Before: " << address_extension << std::endl;
StringToNumeric(address_extension, temp);
std::cout << "After: " << temp << std::endl;
...

template <typename T>
void StringToNumeric(const std::string& source, T& target)
{
    //Check if source is hex
    if(IsHexNotation(source))
    {
       std::stringstream ss;
       //Put value in the stream
       ss << std::hex << source;
       //Stream the hex value into a target type
       ss >> target;
     }

 }

IsHexNotation()が正しく動作し、宣言されているとおりにソースを変更しないことを保証できます。

bool IsHexNotation(const std::string& source)

16 進文字列を uint8 に変換する正しい方法は何ですか (16 進文字列がデータ型に収まる場合)?

4

1 に答える 1

5

このようなコードを使用すると、私にとってはうまくいきます:

std::stringstream ss;
int target(0);
ss << std::hex << source;
if (ss >> target) {
    std::cout << "value=" << target << '\n';
}
else {
    std::cout << "failed to read value\n";
}

ただし、文字列ストリームの読み取り位置を書き込み後にどこにすべきかについての議論があったことを覚えています。ほとんどの場合、ファイル ストリームのモデルに従っているため、同じ位置であっても目的の位置をシークする必要があります。共通の位置を使用する実装もあれば、別々の読み取り位置と書き込み位置を使用する実装もありました。使用してみることができます

ss.seekg(0, std::ios_base::beg);

読み取り位置がストリームの先頭にあることを確認します。または、私の意見では望ましいのは、を初期化し、std::istringstreamそこから直接読み取ることです。

std::istringstream in(source);
if (in >> std::hex >> target) { ... }

抽出が成功したかどうかを常に確認する必要があることに注意してください。このようにして、実際に何かがうまくいかず、値0が変数の初期値である可能性があるというヒントが得られます。

于 2013-08-21T00:19:31.590 に答える