0

在我的项目中,我编写了这样的转换函数:

    // len should be > 0
uint32_t stringToInt(unsigned char const* buffer, int len) {
    uint32_t result = buffer[0] - '0';
    for (int i = 1; i < len; i++) {
        result *= 10;
        result += buffer[i] - '0';
    }
    return result;
}

是否有任何 stl / boost 方法可以以相同的速度做同样的事情?如果不是这样,那么您可以进一步改进我的版本吗?

我不能使用atoi,因为它不允许提供len. 我也不想为atoi调用创建临时缓冲区。

4

2 回答 2

2

来自C 中的 atoi 实现,稍作修改以考虑长度。

int my_atoi(char *p,int len) {
 int k = 0;
 for (int i=0;i<len;i++) {
 k = (k<<3)+(k<<1)+(*p)-'0';
 p++;
 }
 return k;
}

如果您想要尽可能快的 atoi 实现,一种方法是检查 gcc 源中的 atoi 实现并对其进行修改以匹配您对长度的额外要求......

于 2013-05-01T19:57:23.890 回答
0

一年前看过这个。它可能更慢但更有趣:

int stringToInt(char *buffer, int len) {
    if (len > 0) {
        return myStoi(buffer + len - 1, len);
    }
    return 0;
}

int myStoi(char *curr, int len) {
    if (--len) {
        return myStoi(curr-1, len) * 10 + (*curr - '0');
    }
    return (*curr - '0');
}

这和原来的一样,假设缓冲区内容是有效的数字字符。(即没有前导空格或破折号或加号,没有内部点或字母字符)

于 2013-05-01T19:35:25.737 回答