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

时间:2012-12-11 23:25:36

标签: c++

将char *转换为数字的最快方法是什么?我需要将4个字符转换为int,或将两个字符转换为short 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)

但是结果总是为零。(解释我将数字转换为char *而不是通过网络发送,另一方面我试图逆转进程)。

3 个答案:

答案 0 :(得分: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,但是这个案例怎么样{ {1}})。在使用C ++时,可以选择使用int i = atoi("0");

stringstream

不幸的是,我这里没有C ++ 11编译器,因此我无法使用#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; } 尝试变体。

修改2

我做了一些快速研究,这里的主题建议使用std::stoi函数:How to parse a string to an int in C++?

答案 1 :(得分:3)

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

使用c ++运算符优先级是:

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

难怪它永远是0.使用parens。您也可以使用|,但无论如何我都建议使用parens。

答案 2 :(得分:2)

根据您的示例代码进行猜测我认为这正是您所寻找的(您真的有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;
}