Object-c 纯手写方法CRC8,16,32,跟我用笔计算的一样,不过跟那些代码算法结果32位的不同

    CRC8正确方法

    again只能为2个字,不然的话得自己更改23n-8的位移数目

    

    int again  = 0x3842;

    again = again <<8;

    NSLog(@"%x",again);

    for (int n = 23; n>0; n--) {

        if (again >>n & 1) {

            NSLog(@"n= %d",n);

            again ^= (0x131<<(n-8));

            NSLog(@"%x",again);

        }else{

            again = again;

        

        }

        if (again <0x0100) {

            NSLog(@"xiao--%d",n);

            NSLog(@"again=%x",again);

            return 0;

        }

    }



    CRC16正确方法

    again只能为4个字,不然的话得自己更改47n-16的位移数目

    unsigned long ploy =0x11021;

    unsigned long again  = 0x11223344;

    again = again <<16;

    NSLog(@"%lx",again);

    for (int n = 47; n>0; n--) {

        if (again >>n & 1) {

            NSLog(@"n= %d",n);

            again ^= (ploy<<(n-16));

            NSLog(@"%lx",again);

        }else{

            again = again;

            

        }

        if (again <0x010000) {

            NSLog(@"xiao--%d",n);

            NSLog(@"again=%lx",again);

            return 0;

        }

    }


CRC正确方法二,采用分步位移的方法,避免一次性全部位移而超出64.

    unsigned long ploy =0x11021;

    unsigned long again  = 0x01020304;

    

    

    for (int j =0; j<5; j++) {

        NSLog(@"j%d",j);

        if (j!=0) {

            again = again << 4;

        }

        

        NSLog(@"%lx",again);

        

        for (int n = 31; n>0; n--) {


            if (again >>n & 1) {

                NSLog(@"n2= %d",n);

                again ^= (ploy<<(n-16));

                NSLog(@"%lx",again);

            }else{

                again = again;

                

            }

            if (again <0x010000) {

                NSLog(@"xiao--%d",n);

                NSLog(@"again=%lx",again);

                break;

            }

        }

    }


    return 0;


      crc32的方法

    unsigned long ploy =0x104c11db7;

    unsigned long again  = 0x40ff048001000000;

    

    for (int j =0; j<9; j++) {

        NSLog(@"j%d",j);

        if (j!=0) {

            again = again << 4;

        }

        

        NSLog(@"%lx",again);

        

        for (int n = 63; n>0; n--) {

            

            if (again >>n & 1) {

                NSLog(@"n2= %d",n);

                again ^= (ploy<<(n-32));

                NSLog(@"%lx",again);

            }else{

                again = again;

                

            }

            if (again <0x0100000000) {

                NSLog(@"xiao--%d",n);

                NSLog(@"again=%lx",again);

                break;

            }

        }

    }

    

    return 0;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值