2012-06-08 183 views
2

我正在嘗試計算ALAsset的CRC校驗和。我的目標是保存所有的CRC,並在稍後比較它們以查看資產是否已更改,但每次爲同一資產生成CRC時,我都會得到不同的結果。爲ALAsset計算CRC校驗和

要生成CRC:

#import "CRC32.h" 
#import <zlib.h> 

@implementation CRC32 

+ (uint32_t)CRC32Value:(NSData*)data 
{ 
    uLong crc = crc32(0L, Z_NULL, 0); 
    crc = crc32(crc, [data bytes], [data length]); 
    return crc; 
} 

@end 

如何使用它:

void(^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
    {   
    if(result == nil) 
    { 
     return; 
    } 

    CrawlAssetData *assetData = [[CrawlAssetData alloc] init]; 
    [assetData setCrc:[CRC32 CRC32Value:[NSData dataWithBytes:&(result) 
                 length:sizeof(result)]]]; 

這裏是我的結果在不同的場合對CRC的同一資產時:

ID:17575
url:assets-library://asset/asset.JPG?id = BB282CBD-F5B1-4771-B48B-E021224C7384 & ext = JPG
文件大小:1394332
CRC:3605102491
CREATIONTIME:2456085.397025

ID:17826
網址:資產庫://asset/asset.JPG ID = BB282CBD-F5B1-4771-B48B -E021224C7384 & EXT = JPG
文件大小:1394332
CRC:1383370697
CREATIONTIME:2456085.397025

正如你所看到的,文件大小和url是相同的,但CRC是不同的。

我在計算CRC錯誤嗎?還是應該使用ALAsset的不同部分來生成CRC?每次檢索ALAsset時,可能有些數據是不同的?

在此先感謝!

回答

1

這條線:

[assetData setCrc:[CRC32 CRC32Value:[NSData dataWithBytes:&(result) 
                length:sizeof(result)]]]; 

...是計算CRC的ALAsset實例的地址的,而不是它的數據。

您可以通過分割線驗證這一點:

NSData *crcData = [NSData dataWithBytes:&(result) 
           length:sizeof(result)]; 
NSLog(@"crcData length: %d", [crcData length]); 
[assetData setCrc:[CRC32 CRC32Value:crcData]]; 

我的猜測是,在輸出你會看到crcData length: 4

基於對這個問題提問者跟進評論(有校正)的代碼來做到這一點:

ALAssetRepresentation *rep = [result defaultRepresentation]; 
uint8_t *buffer = malloc(rep.size); 
NSUInteger buffered = [rep getBytes:buffer 
         fromOffset:0 
          length:rep.size 
           error:nil]; 
NSData *data = [NSData dataWithBytesNoCopy:buffer 
            length:buffered 
           freeWhenDone:YES]; 
uint32_t CRC32 = [CRC32 CRC32Value:data]; 
[assetData setCrc:CRC32]; 

特別要注意的是sizeof(NSData*)(或NSData *a; sizeof(A))始終將是大小指針(4位用於32位系統,如iPhone,8位用於64位Mac OS X),而不是存儲在NSData中的字節數據的長度。沒有正常的理由得到sizeof()一個NSObject 指針

+0

非常感謝!多麼簡單的錯誤。我重複使用了一些使用地址的其他代碼,並忘記取出它。 這裏是修復: '[assetData setCrc:[CRC32 CRC32Value:[NSData的dataWithBytes:([數據字節]) 長度:的sizeof(數據)]]];' – jtromo

+1

最終修復: 'ALAssetRepresentation *代表= [結果defaultRepresentation]; Byte * buffer =(Byte *)malloc(rep.size); NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil]; NSData * data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; [assetData setCrc:[CRC32 CRC32Value:[NSData的dataWithBytes:([數據字節]) 長度:的sizeof(數據)]]];' – jtromo

+0

我很高興你理解了它。我對Assets Library不熟悉,看起來很奇怪,這是獲取原始數據的最佳方式,但看起來你是對的。我將把這個編輯成我的答案,供任何人在未來看到這個問題。 –