打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
文件校验之rsync源码分析

http://blog.csdn.net/flyfish1986/article/details/2606173

2008

rsync 弱校验采用的是adler32算法
下面是linux下的校验源码
uint32 get_checksum1(char *buf1, int32 len)
{
    int32 i;
    uint32 s1, s2;
    schar *buf = (schar *)buf1;

    s1 = s2 = 0;
    for (i = 0; i < (len-4); i+=4) {
 s2 += 4*(s1 + buf[i]) + 3*buf[i+1] + 2*buf[i+2] + buf[i+3] +
   10*CHAR_OFFSET;
 s1 += (buf[i+0] + buf[i+1] + buf[i+2] + buf[i+3] + 4*CHAR_OFFSET);
    }
    for (; i < len; i++) {
 s1 += (buf[i]+CHAR_OFFSET); s2 += s1;
    }
    return (s1 & 0xffff) + (s2 << 16);
}
如果在windows下运行需要更改一下
unsigned long get_checksum1(unsigned char *buf1, int len)
{
    int i;
    unsigned long s1, s2;
    char *buf = (char *)buf1;

    s1 = s2 = 0;
    for (i = 0; i < (len-4); i+=4) {
 s2 += 4*(s1 + buf[i]) + 3*buf[i+1] + 2*buf[i+2] + buf[i+3] +
   10*CHAR_OFFSET;
 s1 += (buf[i+0] + buf[i+1] + buf[i+2] + buf[i+3] + 4*CHAR_OFFSET);
    }
    for (; i < len; i++) {
 s1 += (buf[i]+CHAR_OFFSET); s2 += s1;
    }
    return (s1 & 0xffff) + (s2 << 16);
}

也可以自己编写一个
unsigned long adler32(unsigned char *buf, int len)
{
 
 
 unsigned long s1 = 0;
 unsigned long s2 = 0;
 
 int i;
 for (i = 0; i < len; i++)
 {
  s1 = (s1 + buf[i]) % 65521;
  s2 = (s2 + s1) % 65521;
 }
 return (s2 << 16) + s1;
}

未完 只是个开始,我的另一篇文章adler32算法的实现和这个不一样,只是在s1的初始值是1

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[CVC]iconv库的使用
PCM音频重采样,音量控制(c实现)
framebuffer画bmp
linux pid文件
apue.h包头找不到的问题
跨平台C++ Base 64 编码解码函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服