从字符串转换为 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.
上观看直播
我正在为图像编辑制作一个 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.