将字符*转换为数字的最快方法是什么

What is the quickest way to translate char* to number?

本文关键字:方法 是什么 数字 字符 转换      更新时间:2023-10-16

将字符*转换为数字的最快方法是什么?我需要将 4 个字符转换为 int,或将两个字符转换为短 int。我试过像

char* ar;
//fill ar with values  
int x= ar[1]+1[2]<<8+ar[3]<<16+ar[4]<<24; // ar[0] number of chars for number (short 2, int 4)

但结果始终为零。(为了解释我将数字转换为字符*,然后通过网络发送,另一方面我正在尝试反向处理)。

使用atoi函数:

#include <iostream>
#include <cstdlib>
int main ()
{
  int i;
  char * num = "325";
  i = atoi (num);
  std::cout << i << std::endl;
  return 0;
}

编辑

正如注释中所指出的,您不应该使用atoi函数,因为您无法看到转换中是否存在错误(如果失败,atoi将返回 0,但这种情况int i = atoi("0");呢)。当您使用C++时,可以选择使用stringstream

#include <iostream>
#include <sstream>
using namespace std;
int main()
{
        char * num = "3443";
        int result;
        stringstream ss;
        ss << num;
        ss >> result;
        if (!ss.fail()) {
            cout << result << endl;
        }

        return 0;
}

不幸的是,我这里没有 C++11 编译器,所以我无法尝试使用 std::stoi 变体。

编辑 2

我已经做了一些快速的研究,这里有一个建议使用strtol函数的主题:如何在C++中将字符串解析为 int?

ar[1]+1[2]<<8+ar[3]<<16+ar[4]<<24; 

使用 c++ 运算符的优先级为:

(ar[1]+1[2]) << (8+ar[3]) << (16+ar[4]) << 24

难怪它总是 0。使用帕伦斯。你也可以使用|,但我还是建议使用括号。

根据您的示例代码进行猜测,我认为这就是您正在寻找的(您真的有void*而不是char* ???)

unsigned int getValue(char* c) {
    if (c[0] == 0x2) {
        return *(reinterpret_cast<unsigned short*>(c + 1));
    } else if (c[0] == 0x4) {
        return *(reinterpret_cast<unsigned int*>(c + 1));
    } else {
        assert(false);
    }
}
int main() {
    char c[5];
    char d[5];
    c[0] = 0x2;
    d[0] = 0x4;
    char* cStart = &c[1];
    *(reinterpret_cast<unsigned short*>(cStart)) = 1000;
    char* dStart = &d[1];
    *(reinterpret_cast<unsigned int*>(dStart)) = 1123124;
    std::cout << getValue(c) << std::endl;
    std::cout << getValue(d) << std::endl;
    return 0;
}