FastDFS中long2buff解析笔记

来源:互联网 发布:关于北京知实践园作文 编辑:程序博客网 时间:2024/05/16 13:47

long2buff解析笔记

在阅读fastdfs中遇到了long2buffer函数,对于里面的位移操作以及unsigned char* 操作感觉很迷茫> 查找资料后总结如下:

void long2buff(int64_t n, char *buff)
{
unsigned char *p;
p = (unsigned char *)buff;
*p++ = (n >> 56) & 0xFF;
*p++ = (n >> 48) & 0xFF;
*p++ = (n >> 40) & 0xFF;
*p++ = (n >> 32) & 0xFF;
*p++ = (n >> 24) & 0xFF;
*p++ = (n >> 16) & 0xFF;
*p++ = (n >> 8) & 0xFF;
*p++ = n & 0xFF;
};


1.int与char,unsigned char之间相互赋值:

    char字面解释,有符号字符型,当用char对int进行赋值时,系统认为最高位是符号位,赋值的时候,就会对最高位进行扩展。    unsigned char 字面解释,无符号字符型,当用unsigned char对int赋值时,系统就不会进行扩展。         由于unsigned char类型的变量只有一个字节,表示范围:0~255,char 只有一个字节,表示范围:-128~127。    而int类型有4个字节(32位系统下)取值:-2147483648 ~ +2147483647.    unsigned int取值范围: 0 ~ 4294967295(4 Bytes)     char只有一个字节,int有4个字节, 当把int 变量赋值给 char变量时会发生截断,截断的是unsigned int的(大端下)高位的三字节部分。

1.移位操作:<<左移,>>右移:

    <<表示向左移位:n<<1就是左移1位,    原来      | 移位后    -------- | ---    00011001 | 00110010    >>表示向右移位:n>>3就是右移1位.    左边的移除,右侧补零,相当于/2.        原来  | 移位后    -------- | ---    00011000 | 00001100

1.解析long2buffer:

1.*p++ = (n >> 56) ,移位56位,n变量是64位,右移56位,移动56位,*p++=(n>>48)….*p++(n >> 8) ,这一段话相当于将高8位移位至低8位。也就是移动一个字节
2. & 0xFF,0xFF是16进制,转换为2进制:1111 1111。主要是验证作用
3. & 操作,1&0=0,1&1=1,0&0=0,目的,截断低8位前面的数据。
4. (p)指向第一个unsigned char 数组,*p则是指向的值,‘’和’++’的优先级是相同的,结合是由右到左,所以,P++==(p++),此时还没有到‘;’,语句没结束,p还是指向的第0个,是指向的第一个,到分号后,p的值就是+1,后的了。
这句话的意思是:将n取最高位8个字节,进行验证(&0xFF),后赋值给p指向的第一块unsigned char内存。
到最后结束后,p指向的是第9块内存。

1 0
原创粉丝点击