C++ C++;将字符串转换为uint64\u 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=词法转

我正在尝试将字符串转换为uint64\t整数
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;
  }
}