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

Casting from string to uint8 and vice versa

我正在为图像编辑制作一个 GUI,我需要显示和处理来自用户的 RGB 值。因此我使用 uint8_t 来存储这些值和 stringstream 到 get/set 值 from/to 一个字符串。我的问题是 uint8_t 被认为是一个字符,所以 returns 只是字符串的第一个字符。

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

因为我使用模板化函数进行转换,所以我希望尽可能少地更改代码(当然)。这是我使用的转换函数:

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,知道吗?

您需要先将值读取为 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);
}

似乎强制转换不是这里工作的正确工具。强制转换是将一个值重新解释为给定类型或将相似类型相互转换(想想,double 到 int,反之亦然,或者 base class pointer 到 derived class pointer)。 string 和 integer 类型并没有以这种方式密切相关。我认为您想要做的是将字符串显式转换为整数,这表明 std::stoi() 是您想要的。

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

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

打印:123。在 Coliru.

上观看直播