从字符串转换为uint8,反之亦然[重复]

问题描述 投票:1回答:2

这个问题在这里已有答案:

我正在为图像版本制作GUI,我需要显示和处理用户的RGB值。因此,我使用uint8_t存储这些值和stringstream来从/获取/设置字符串的值。我的问题是uint8_t被认为是一个char,所以cast只返回字符串的第一个字符。

示例:假设我设置输入字符串“123”,我的返回值将为49(ASCII代码为“1”)

当我使用模板化函数来制作演员表时,我想尽可能少地修改代码(当然)。这是我使用的强制转换功能:

template<typename T>
T Cast(const std::string &str) {
    std::stringstream stream;
    T value;
    stream << str;
    stream >> value;
    if (stream.fail()) {
        Log(LOG_LEVEL::LERROR, "XMLCast failed to cast ", str, " to ", typeid(value).name());
    }
    return value;
}

所以,当我这样做

uint8_t myInt = Cast<uint8_t>("123");

我有49而不是123,任何想法?

c++ casting stringstream uint8t
2个回答
0
投票

您需要先将值读作unsigned (short) int(或uint(16|32)_t,如果您愿意),然后您可以将其截断为uint8_t。由于您的函数是模板化的,因此您可以简单地为uint8_t提供一个特殊化,以便与其他类型不同地处理它:

template<>
uint8_t Cast<uint8_t>(const std::string &str) {
    std::istringstream stream(str);
    uint16_t value;
    if ((!(stream >> value)) || (value > 0x00FF)) {
        Log(LOG_LEVEL::LERROR, "XMLCast failed to cast ", str, " to ", typeid(uint8_t).name());
    }
    return static_cast<uint8_t>(value);
}

1
投票

看起来演员阵容不适合这里的工作。强制转换是将一个值重新解释为给定类型或将相似类型转换为彼此(想想,double转换为int,反之亦然,或者指向派生类指针的基类指针)。类型字符串和整数以这种方式不是密切相关的。我想你想要做的是显式地将字符串转换为一个整数,这表明std::stoi()是你想要的。

void Foo( const std::string& str ) 
{
    const auto i = std::stoi( str );
    std::cout << i << '\n';
    // ...
}

int main()
{
    Foo( "123" );
}

印刷品:123。在Coliru上看到它。

© www.soinside.com 2019 - 2024. All rights reserved.