1。 初始化crctables数组
在.h文件里声明:
NSMutableArray *crcTables;
BOOLhadInitCRCTables; //已初始化标志
.m里处理
- (void) initCRCTables;
{
if (hadInitCRCTables)
return;
hadInitCRCTables =YES;
crcTables = [[NSMutableArrayalloc] initWithCapacity:256];
longlong int ploy =0xEDB88320;
longlong int crc;
for (int i =0; i <= 255; i ++) {
crc = i;
for (int j =8; j >= 1; j --) {
if ((crc &1) == 1) {
crc = (crc >>1) ^ ploy;
}
else {
crc = (crc >>1) ;
}
}
[crcTablesaddObject:[NSNumbernumberWithLong: crc]];
}
}
2. 取文件crc
- (longlong int) getFileCRC: (NSString *)path;
{
longlong int crc =0xFFFFFFFF;
[selfinitCRCTables];
//创建文件管理器
NSFileManager *fm = [NSFileManagerdefaultManager];
if (![fmfileExistsAtPath: path]) {
NSLog(@"文件不存在");
return0;
}
//得到文件大小
NSError *error =nil;
NSDictionary* dictFile = [[fmattributesOfItemAtPath:path error:&error] retain];
if (error)
{
NSLog(@"GetFileSize error: %@", error);
//break;
return0;
}
int len = [dictFilefileSize];
//NSLog(@"file size=%d", nFileSize);
NSFileHandle *inFile;
inFile = [NSFileHandlefileHandleForReadingAtPath: path];
if (inFile ==nil)
{
NSLog(@"open file for reading failed");
return0;
}
//设置当前偏移量
[inFileseekToFileOffset: 0];
int bufferSize;
int j;
while (YES) {
if (len <=0) break;
if (len >=10240)
bufferSize =10240;
else
bufferSize = len;
NSData *data = [inFilereadDataOfLength: bufferSize];
Byte *byteData = (Byte *)[data bytes];
j =0;
while (j < bufferSize) {
int iIndex = (crc ^ byteData[j]) &0xFF;
NSNumber *num = [crcTablesobjectAtIndex:iIndex];
crc = ((crc >>8) & 0xFFFFFF) ^ [numunsignedLongValue];
j ++;
}
len -= bufferSize;
}
[inFilecloseFile];
NSLog(@"result = %llu", crc ^ 0xFFFFFFFF);
return (crc ^0xFFFFFFFF);
}