gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 16:19:48 27 4
gpt4 key购买 nike

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

我尝试使用 boost::lexical_cast 但我得到了一个 bad_lexical_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;
}

}

您可以放心,IsHexNotation() 工作正常并且不会更改声明的源:

bool IsHexNotation(const std::string& source)

将十六进制字符串转换为 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";
}

但是,我记得曾经讨论过一个字符串流的读取位置应该在写入之后的位置。由于它主要遵循文件流模型,因此您需要寻找所需的位置,即使它是相同的位置。一些实现使用公共(public)位置,而其他实现使用单独的读取和写入位置。您可以尝试使用

ss.seekg(0, std::ios_base::beg);

确保读取位置在流的开头。或者,在我看来更可取的是,初始化一个 std::istringstream 并直接从中读取:

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

请注意,您总是想检查提取是否成功:这样您会得到一个提示,表明确实出了问题,并且值 0 可能只是变量的一些初始值。

关于c++ - 如何将十六进制字符串转换为 Uint8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18346726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com