如何将unsigned char *快速转换为整数,

时间:2013-05-01 19:15:22

标签: c++

在我的项目中,我编写了这样的转换功能:

    // 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调用创建临时缓冲区。

2 个答案:

答案 0 :(得分:2)

atoi implementation in C开始,稍加修改即可考虑长度。

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实现并修改它以满足你对长度的额外要求......

答案 1 :(得分: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');
}

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