从字符串转换为uint8,反之亦然

时间:2019-04-22 19:18:54

标签: c++ casting stringstream uint8t

我正在制作图像版本的GUI,我需要显示和处理用户的RGB值。因此,我使用uint8_t存储这些值,并使用stringstream从字符串获取/设置值。我的问题是uint8_t被视为一个字符,因此强制类型转换仅返回字符串的第一个字符。

示例: 假设我将输入字符串设置为“ 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,知道吗?

2 个答案:

答案 0 :(得分: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 上实时观看。

答案 1 :(得分: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);
}