在我的项目中,我编写了这样的转换功能:
// 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
调用创建临时缓冲区。
答案 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字符)