C++ C++;将字符串转换为uint64\u t
我正在尝试将字符串转换为uint64\t整数C++ C++;将字符串转换为uint64\u t,c++,string,uint64,C++,String,Uint64,我正在尝试将字符串转换为uint64\t整数stoi返回一个32位整数,因此在我的例子中它不起作用。还有其他解决办法吗 如果您使用的是C++11或更高版本,请尝试 也可能有帮助。我没有将此标记为重复,因为另一个问题是关于C的。如果使用boost,则可以使用 #包括 #包括 #include//我已经安装了多个版本的boost,因此此路径对您可能有所不同 int main() { 使用boost::词法转换; 使用名称空间std; 常量字符串s(“24242”); uint64_t num=词法转
stoi
返回一个32位整数,因此在我的例子中它不起作用。还有其他解决办法吗 如果您使用的是C++11或更高版本,请尝试
也可能有帮助。我没有将此标记为重复,因为另一个问题是关于C的。如果使用boost,则可以使用
#包括
#包括
#include//我已经安装了多个版本的boost,因此此路径对您可能有所不同
int main()
{
使用boost::词法转换;
使用名称空间std;
常量字符串s(“24242”);
uint64_t num=词法转换;
你试过了吗
uint64_t value;
std::istringstream iss("18446744073709551610");
iss >> value;
?
看
这可能也适用于过时的标准。如果您使用的是C++11或更高版本,则可以使用中的strtoull()。
否则,如果c99也需要这个函数,可以从C中选择strtoull()函数
请参见下面的示例
#include <iostream>
#include <string>
#include <cstdlib>
int main()
{
std::string value= "14443434343434343434";
uint64_t a;
char* end;
a= strtoull( value.c_str(), &end,10 );
std::cout << "UInt64: " << a << "\n";
}
#包括
#包括
#包括
int main()
{
std::string value=“144434”;
uint64_t a;
字符*结束;
a=strtoull(value.c_str(),&end,10);
STD::CUT注释:这是C的解决方案,不是C++的,所以在C++中可能会比较难。
在这里,我们将字符串十六进制转换为uint64\u t十六进制值。字符串的所有单个字符都被转换为十六进制整数ony,单位为1。例如,在base 10->String=“123”中:
- 第1个循环:值为1
- 第二个循环:值为1*10+2=12
- 第三个循环:值为12*10+3=123
所以像这样的逻辑用于将十六进制字符的字符串转换为uint_64hex值
uint64_t stringToUint_64(String value) {
int stringLenght = value.length();
uint64_t uint64Value = 0x0;
for(int i = 0; i<=stringLenght-1; i++) {
char charValue = value.charAt(i);
uint64Value = 0x10 * uint64Value;
uint64Value += stringToHexInt(charValue);
}
return uint64Value;
}
int stringToHexInt(char value) {
switch(value) {
case '0':
return 0;
break;
case '1':
return 0x1;
break;
case '2':
return 0x2;
break;
case '3':
return 0x3;
break;
case '4':
return 0x4;
break;
case '5':
return 0x5;
break;
case '6':
return 0x6;
break;
case '7':
return 0x7;
break;
case '8':
return 0x8;
break;
case '9':
return 0x9;
break;
case 'A':
case 'a':
return 0xA;
break;
case 'B':
case 'b':
return 0xB;
break;
case 'C':
case 'c':
return 0xC;
break;
case 'D':
case 'd':
return 0xD;
break;
case 'E':
case 'e':
return 0xE;
break;
case 'F':
case 'f':
return 0xF;
break;
}
}
uint64\u t stringToUint\u 64(字符串值){
int stringLenght=value.length();
uint64_t uint64值=0x0;
for(int i=0;我不使用boost@BaummitAugenhhhhm,lexical_cast
如何在这里发挥作用?@πάνταῥεῖ 后者是答案所有者的工作,但对于前者:boost::lexical_cast
非常容易使用,并且(至少根据他们自己的基准,最新的数字是用gcc6.1测量的),比stringstream
和scanf
+朋友(用于手头的转换)快得多。因此,如果您正在使用boost,这是一个很好的转换方法。@Vada,它不会妨碍您根据以下内容改进您的答案:@Vada应是自包含的,并显示一个良好的可重用代码示例。无需使用.c_str()
,您可以直接使用std::string
。这可能也更快。好吧,c++11从几年前就可以被视为当前的标准。它是一个标准,但不是标准。仍然有很多人因为工作或遗留代码或其他原因而使用c++03。当然,标准是c++14?@Gambit您返回的是一个非uint64_t的无符号long long,它不一定是64位,具体取决于编译位置。如果无符号long long不是64位,为什么您的解决方案仍然有效。@Cauchy它必须至少是64位,因此它可以包含64位整数,您只需在answ中对实时演示进行少量编辑即可确认呃,std::istringstream
如果您提供的字符串不是整数,则返回0。std::stoull
抛出一个std::invalid_参数
:。@davidvandbunte您可以通过断言从iss>>返回的流值
与true
比较来检查提取是否成功,也可以启用e通过iss.exceptions(std::ios::failbit | std::ios::badbit)处理流上的异常
。我完全不认为这可能是一个更好的答案。它更长,更复杂,更容易理解,更容易出错。你能解释一下你想实现什么吗?而不是仅仅发布代码?@ChemiCalChems它将直接将字符串转换为64位。我还搜索了许多网站和公司对于esp8266 c代码,我找不到一个好的工作方法。所以最后我自己写了一篇文章。理想情况下,只要改变一位,它就可以将任何字符串转换为任何基。但在这里,它可以转换为64位。@Kyrol这里我试着做的是逐个将字符串的每个字符转换为十六进制整数。然后赋予它值。如果你仔细阅读代码的话你必须明白我做了什么。它对我来说是完美的。经过4天的失败研究,我写了这个。“HiloliddinJaloliddinzoda感谢解释和评论。+ 1,因为,即使不是C++,它仍然是一个很好的解决方案。
uint64_t stringToUint_64(String value) {
int stringLenght = value.length();
uint64_t uint64Value = 0x0;
for(int i = 0; i<=stringLenght-1; i++) {
char charValue = value.charAt(i);
uint64Value = 0x10 * uint64Value;
uint64Value += stringToHexInt(charValue);
}
return uint64Value;
}
int stringToHexInt(char value) {
switch(value) {
case '0':
return 0;
break;
case '1':
return 0x1;
break;
case '2':
return 0x2;
break;
case '3':
return 0x3;
break;
case '4':
return 0x4;
break;
case '5':
return 0x5;
break;
case '6':
return 0x6;
break;
case '7':
return 0x7;
break;
case '8':
return 0x8;
break;
case '9':
return 0x9;
break;
case 'A':
case 'a':
return 0xA;
break;
case 'B':
case 'b':
return 0xB;
break;
case 'C':
case 'c':
return 0xC;
break;
case 'D':
case 'd':
return 0xD;
break;
case 'E':
case 'e':
return 0xE;
break;
case 'F':
case 'f':
return 0xF;
break;
}
}