【问题标题】:Casting from string to uint8 and vice versa [duplicate]从字符串转换为uint8,反之亦然[重复]
【发布时间】:2019-04-23 03:39:13
【问题描述】:

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

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

【问题讨论】:

  • '1' 字符在 ascii 中的数值为 49

标签: c++ casting stringstream uint8t


【解决方案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 上观看直播。

【讨论】:

  • “强制转换是将一个值重新解释为给定类型。” 不完全是。大多数演员实际上转换,他们不重新解释。除了reinterpret_cast 用于重新解释内存表示(在极少数情况下允许)。
  • @FrançoisAndrieux 公平点。我试图澄清。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多