我正在尝试将字符串转换为boost::uint64_t
,pvalue
的内容为12345678901234567890
。我现在使用的代码是:
void setAttribute(EnumAttrTyoe pname, const void *pvalue) {
if (pname == SESS_ID) {
const char *raw_sess_id = reinterpret_cast<const char*>(pvalue);
std::string str_sess_id(raw_sess_id);
std::cout << "Trying to open session id: '" << str_sess_id << "'\n";
m_session_id = boost::lexical_cast<unsigned long long>(str_sess_id);
}
}
这个抛出异常,消息“bad lexical cast:源类型值无法解释为目标”。相反,我使用此代码:
void setAttribute(EnumAttrTyoe pname, const void *pvalue) {
if (pname == SESS_ID) {
const char *raw_sess_id = reinterpret_cast<const char*>(pvalue);
std::string str_sess_id(raw_sess_id);
std::stringstream ss;
ss << raw_sess_id;
ss >> m_session_id;
}
}
它通过,但m_session_id
的值为0.我还没有检查ss
的标志,但我不需要知道它失败了。任何想法现在该做什么?
UPDATE 没有C ++ 11,因为我无法使用它,而我的编译器是VC ++ 2008,升级版本为1.43.0。
答案 0 :(得分:0)
此代码适用于我:
#include <sstream>
#include <cstdint>
#include <iostream>
int main()
{
std::stringstream ss;
ss << "12345678901234567890";
std::uint64_t n = 0;
ss >> n;
std::cout << n << "\n";
}
标准输出: 12345678901234567890
答案 1 :(得分:0)
我认为您输入的C风格字符串不是您认为的那样。这个boost::lexical_cast
的使用对我来说有助于提升1.42:
#include <iostream>
#include <boost/lexical_cast.hpp>
#include <boost/cstdint.hpp>
int main() {
std::string s = "12345678901234567890";
boost::uint64_t i = boost::lexical_cast<boost::uint64_t>(s);
std::cout << i << '\n';
return 0;
}
我的猜测是你的输入不是零终止,有一个你不期望的后缀,或者有一个像UTF16这样的替代编码。或许它甚至不是一个字符串。