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字符串
}

猜你喜欢

转载自www.cnblogs.com/cquccy/p/13398394.html