C++ 将字符串转换为 uint64_t
C++ convert string to uint64_t
我正在尝试将字符串转换为 uint64_t 整数。 stoi
returns 一个 32 位整数,所以它不适用于我的情况。还有其他解决方案吗?
如果您使用的是 C++11 或更高版本,请尝试 std::stoull
。
This post 也可能有帮助。我没有将其标记为重复,因为另一个问题是关于 C 的。
如果你正在使用 boost,你可以使用 boost::lexical_cast
#include <iostream>
#include <string>
#include <boost-1_61/boost/lexical_cast.hpp> //I've multiple versions of boost installed, so this path may be different for you
int main()
{
using boost::lexical_cast;
using namespace std;
const string s("2424242");
uint64_t num = lexical_cast<uint64_t>(s);
cout << num << endl;
return 0;
}
试试这个:
#include <iostream>
#include <sstream>
#include <cstdint>
int main() {
uint64_t value;
std::istringstream iss("18446744073709551610");
iss >> value;
std::cout << value;
}
这可能也适用于过时的标准。
如果您使用的是 C++11 或更新版本,则可以使用 <cstdlib> 中的 strtoull()。
否则,如果你也需要 c99,你可以在 C 的 stdlib.h 中使用 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";
}
注意:这是针对 c 而非 C++ 的解决方案。所以它可能比 C++ 更难。
这里我们将 String HEX 转换为 uint64_t 十六进制值。字符串的所有单个字符都被一个一个地转换为十六进制整数。例如,以 10 为基数 -> String = "123":
- 第一个循环:值为 1
- 第二个循环:值为 1*10 + 2 = 12
- 第三个循环:值为 12*10 + 3 = 123
所以像这样的逻辑用于将 HEX 字符的字符串转换为 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;
}
}
所有这些解决方案都不符合我的需要。
- istringstream - 将字符串“123asd”解析为 123.
- stoull - 会引发错误,我不想
使用 try catch。
- 当时并没有使用boost。
所以我只用了一个for循环:
uint64_t val = 0;
for (auto ch: new_str) {
if (not isdigit(ch)) return 0;
val = 10 * val + (ch - '0');
}
编辑:
另一个问题是溢出,如果字符串的数字大于 uint64_t。我添加了另一个开始 if 来检查字符串中的字符数。
我正在尝试将字符串转换为 uint64_t 整数。 stoi
returns 一个 32 位整数,所以它不适用于我的情况。还有其他解决方案吗?
如果您使用的是 C++11 或更高版本,请尝试 std::stoull
。
This post 也可能有帮助。我没有将其标记为重复,因为另一个问题是关于 C 的。
如果你正在使用 boost,你可以使用 boost::lexical_cast
#include <iostream>
#include <string>
#include <boost-1_61/boost/lexical_cast.hpp> //I've multiple versions of boost installed, so this path may be different for you
int main()
{
using boost::lexical_cast;
using namespace std;
const string s("2424242");
uint64_t num = lexical_cast<uint64_t>(s);
cout << num << endl;
return 0;
}
试试这个:
#include <iostream>
#include <sstream>
#include <cstdint>
int main() {
uint64_t value;
std::istringstream iss("18446744073709551610");
iss >> value;
std::cout << value;
}
这可能也适用于过时的标准。
如果您使用的是 C++11 或更新版本,则可以使用 <cstdlib> 中的 strtoull()。 否则,如果你也需要 c99,你可以在 C 的 stdlib.h 中使用 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";
}
注意:这是针对 c 而非 C++ 的解决方案。所以它可能比 C++ 更难。 这里我们将 String HEX 转换为 uint64_t 十六进制值。字符串的所有单个字符都被一个一个地转换为十六进制整数。例如,以 10 为基数 -> String = "123":
- 第一个循环:值为 1
- 第二个循环:值为 1*10 + 2 = 12
- 第三个循环:值为 12*10 + 3 = 123
所以像这样的逻辑用于将 HEX 字符的字符串转换为 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;
}
}
所有这些解决方案都不符合我的需要。
- istringstream - 将字符串“123asd”解析为 123.
- stoull - 会引发错误,我不想 使用 try catch。
- 当时并没有使用boost。
所以我只用了一个for循环:
uint64_t val = 0;
for (auto ch: new_str) {
if (not isdigit(ch)) return 0;
val = 10 * val + (ch - '0');
}
编辑: 另一个问题是溢出,如果字符串的数字大于 uint64_t。我添加了另一个开始 if 来检查字符串中的字符数。