C++ 如何将十六进制字符串转换为Uint8

C++ 如何将十六进制字符串转换为Uint8,c++,casting,C++,Casting,我想知道为什么在将十六进制字符串(0x1)转换为uint8时得到0的结果 我试图使用boost::lexical\u cast但是我得到了一个bad\u lexical\u cast异常。因此,我决定改用stringstream,但得到的值不正确 ... uint8_t temp; std::string address_extension = "0x1"; std::cout << "Before: " << address_extension << std

我想知道为什么在将十六进制字符串(0x1)转换为uint8时得到0的结果

我试图使用
boost::lexical\u cast
但是我得到了一个
bad\u lexical\u cast
异常。因此,我决定改用
stringstream
,但得到的值不正确

...
uint8_t temp;
std::string address_extension = "0x1";
std::cout << "Before: " << address_extension << std::endl;
StringToNumeric(address_extension, temp);
std::cout << "After: " << temp << std::endl;
...

template <typename T>
void StringToNumeric(const std::string& source, T& target)
{
    //Check if source is hex
    if(IsHexNotation(source))
    {
       std::stringstream ss;
       //Put value in the stream
       ss << std::hex << source;
       //Stream the hex value into a target type
       ss >> target;
     }

 }

将十六进制字符串转换为uint8的正确方法是什么(假设十六进制字符串适合数据类型)

使用这样的代码对我来说很有用:

std::stringstream ss;
int target(0);
ss << std::hex << source;
if (ss >> target) {
    std::cout << "value=" << target << '\n';
}
else {
    std::cout << "failed to read value\n";
}
以确保读取位置位于流的开头。或者,我认为更可取的方法是初始化
std::istringstream
,并直接从中读取:

std::istringstream in(source);
if (in >> std::hex >> target) { ... }

请注意,您总是希望检查提取是否成功:这样,您会得到一个提示,表明实际发生了错误,并且值
0
可能只是变量的某个初始值。

使用这样的代码对我很有效:

std::stringstream ss;
int target(0);
ss << std::hex << source;
if (ss >> target) {
    std::cout << "value=" << target << '\n';
}
else {
    std::cout << "failed to read value\n";
}
以确保读取位置位于流的开头。或者,我认为更可取的方法是初始化
std::istringstream
,并直接从中读取:

std::istringstream in(source);
if (in >> std::hex >> target) { ... }

请注意,您总是希望检查提取是否成功:通过这种方式,您会得到一个提示,表明实际发生了错误,并且值
0
可能只是变量的某个初始值。

Hex是数值的表示形式,就像十进制或罗马数字一样。格式化或扫描它时,不进行强制转换。@HotLicks这很有意义-我从来没有这样想过(因此词法强制转换不起作用-它不知道如何处理!)。十六进制是数值的表示形式,就像十进制或罗马数字一样。你格式化或扫描它,你不会强制转换它。@HotLicks这很有意义-我从来没有这样想过(因此,为什么词法强制转换不起作用-它不知道如何处理!)。在尝试了你的实现之后,我的问题似乎是使用
uint8\t
。当我像您一样只使用
int
时,效果很好。关于这会导致变化的原因,你有什么想法吗?@larrylampco:你没有提到你为
target
选择的类型,我假设它是一个合适的整数:虽然字符类型通常表现为小整数,但它们并不总是这样。字符的格式化读取函数首先跳过空白(假设设置了默认的
std::ios_base::skipws),然后读取一个字符。也就是说,您的
uint8\u t
读取值
'0'
(不是值
0
'\0'
),而不是尝试读取十六进制值。尝试实现后,我的问题似乎是使用
uint8\u t
。当我像您一样只使用
int
时,效果很好。关于这会导致变化的原因,你有什么想法吗?@larrylampco:你没有提到你为
target
选择的类型,我假设它是一个合适的整数:虽然字符类型通常表现为小整数,但它们并不总是这样。字符的格式化读取函数首先跳过空白(假设设置了默认的
std::ios_base::skipws),然后读取一个字符。也就是说,您的
uint8\u t
读取值
'0'
(不是值
0
'\0'
),而不是尝试读取十六进制值。