这不是一个日志工具类... 只定义了几个全局函数:
字符串后追加数字
// 比较简单,就是snprintf把字符串转一下,然后append
void AppendNumberTo(std::string* str, uint64_t num) {
char buf[30];
snprintf(buf, sizeof(buf), "%llu", (unsigned long long) num);
str->append(buf);
}
字符串追加字符数组
// 正常字符直接追加,需要转义的字符先处理一下,处理方式值得学习
void AppendEscapedStringTo(std::string* str, const Slice& value) {
for (size_t i = 0; i < value.size(); i++) {
char c = value[i];
if (c >= ' ' && c <= '~') {
str->push_back(c);
} else {
char buf[10];
snprintf(buf, sizeof(buf), "\\x%02x",
static_cast<unsigned int>(c) & 0xff);
str->append(buf);
}
}
}
整型转字符串: 先创建一个空字符串,然后调用字符串追加整数的方法
字符串转义:先创建空字符串,然后追加字符
把一个表示整数的字符数组转成整数:
// C++版的atoi,值得学习
// 1. 考虑了最大整数溢出的问题
// 2. 考虑了第一个字符是否数字的问题
// 3. 看起来只能转正整数
bool ConsumeDecimalNumber(Slice* in, uint64_t* val) {
uint64_t v = 0;
int digits = 0;
while (!in->empty()) {
char c = (*in)[0];
if (c >= '0' && c <= '9') {
++digits;
const int delta = (c - '0');
static const uint64_t kMaxUint64 = ~static_cast<uint64_t>(0);
if (v > kMaxUint64/10 ||
(v == kMaxUint64/10 && delta > kMaxUint64%10)) {
// Overflow
return false;
}
v = (v * 10) + delta;
in->remove_prefix(1);
} else {
break;
}
}
*val = v;
return (digits > 0);
}
网友评论