0

将 char* 转换为 number 的最快方法是什么?我需要将 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* 而不是通过网络发送,另一方面我试图反转过程)。

4

3 回答 3

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?

于 2012-12-11T23:28:50.050 回答
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。使用括号。您也可以使用|,但无论如何我都会建议使用括号。

于 2012-12-11T23:43:44.637 回答
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;
}
于 2012-12-11T23:44:28.037 回答