redis之sds(simple dynamic string)阅读笔记5-sds类型转化
redis之sds(simple dynamic string)阅读笔记5-sds类型转化 ****************************************************************** 函数sdsll2str 将有符号的长长整型 转化为字符串 /* Helper for sdscatlonglong() doing the actual number -> string * conversion. 's' must point to a string with room for at least * SDS_LLSTR_SIZE bytes. 帮助函数sdscatlonglong()做数值转化为字符串工作,传入字符指针必须拥有至少SDS_LLSTR_SIZE(21)长度的空间 * The function returns the length of the null-terminated string * representation stored at 's'. */ 这个函数返回存储在s中以/0结尾的字符串长度 #define SDS_LLSTR_SIZE 21 int sdsll2str(char *s, long long value) { char *p, aux; unsigned long long v; size_t l; /* Generate the string representation, this method produces * an reversed string. */ v = (value < 0) ? -value : value; //如果为负数,先变正, 好统一处理 p = s; do { *p++ = '0'+(v%10); // 模10取余数,即最后一位数字,加上字符‘0’得到对应字符的ASSIC码 v /= 10; // 获取缩小10倍的数值,为下一个最后一位数字做好准备 } while(v);//只要值还大于0,循环就继续 if (value < 0) *p++ = '-'; 如果是负数,最后一位置为符号位- /* Compute length and add null term. */ l = p-s; //通过两个指针的差值 得到字符串长度 *p = '\0'; //字符串以/0结尾 /* Reverse the string. */ //翻转字符串,第一个和最后一个交换,第二个和倒数第二个交换,直到中间不用交换位置 p--; //去除/0 while(s < p) { //如果开头向结尾移动的指针 还没有 超过从结尾向开头移动的指针,就继续交换位置 aux = *s; //将开头向结尾移动的指针 指向的字符 赋给临时变量 aux *s = *p; //将 从结尾向开头移动的指针 指向的字符 赋给 开头向结尾移动的指针 指向的字符 *p = aux; // 将赋给临时变量 aux 赋给 从结尾向开头移动的指针 指向的字符,就完成了一次交换 s++; // 将开头向结尾移动的指针 向结尾方向推进一个字符位置 p--; //将结尾向开头移动的指针 向开头方向推进一个字符位置 } return l; // 返回字符串长度 } ****************************************************************** 函数sdsull2str 将无符号的长长整型 转化为字符串 /* Identical sdsll2str(), but for unsigned long long type. */ int sdsull2str(char *s, unsigned long long v) { char *p, aux; size_t l; /* Generate the string representation, this method produces * an reversed string. */ p = s; do { *p++ = '0'+(v%10); v /= 10; } while(v); 用取模的方法获取每个十进制位的数据 /* Compute length and add null term. */ l = p-s; // 用指针之间的差值获取字符串长度 *p = '\0'; /* Reverse the string. */ p--; //去除末尾的/0 while(s < p) { aux = *s; *s = *p; *p = aux; s++; p--; } 将字符串翻转,举例,原字符串“123456789”,这个时候指正s 指向 字符‘1’的位置,p指向字符‘9’的位置 现在用一个中间变量交换s指向的字符和p指向的字符,即1和9的位置互换,字符串变为“923456781” 然后s向中间推进一位,指向字符‘2’, p也向中间推进一位,指向字符‘8’, 现在用一个中间变量交换s指向的字符和p指向的字符,即2和8的位置互换,字符串变为“983456721” 然后s向中间推进一位,指向字符‘3’, p也向中间推进一位,指向字符‘7’, 现在用一个中间变量交换s指向的字符和p指向的字符,即3和7的位置互换,字符串变为“987456321” 然后s向中间推进一位,指向字符‘4’, p也向中间推进一位,指向字符‘6’, 现在用一个中间变量交换s指向的字符和p指向的字符,即3和7的位置互换,字符串变为“987654321” 然后s向中间推进一位,指向字符‘5’, p也向中间推进一位,指向字符‘5’, 因为s=p,所以循环停止,我们就得到了翻转后的字符“987654321” return l; //返回字符串长度 } 测试如下 unsigned long long lli = 12345678901234567890u; //20位无符号数 printf("lli %llu \n", lli); // 12345678901234567890 char s[21]; int length = sdsull2str(s, lli); printf("lli length %ld \n", length); //20 printf("lli %s \n", s); // 12345678901234567890 ****************************************************************** 函数sdsfromlonglong 将long long 的数值转化为sds字符串 /* Create an sds string from a long long value. It is much faster than: * sdscatprintf(sdsempty(),"%lld\n", value); */ 用长长整型值创建一个sds类型的字符串,它比sdscatprintf创建速度快 sds sdsfromlonglong(long long value) { char buf[SDS_LLSTR_SIZE]; // 定义接收字符串 int len = sdsll2str(buf,value); // 调用sdsll2str 获取转换后的字符串buf return sdsnewlen(buf,len); //创建sds字符串 }