您的位置:首页 > 移动开发 > Objective-C

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

2015-07-08 12:00 513 查看
CRC8正确方法

again只能为2个字,不然的话得自己更改23,n-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个字,不然的话得自己更改47,n-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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: