我正在嘗試計算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時,可能有些數據是不同的?
在此先感謝!
非常感謝!多麼簡單的錯誤。我重複使用了一些使用地址的其他代碼,並忘記取出它。 這裏是修復: '[assetData setCrc:[CRC32 CRC32Value:[NSData的dataWithBytes:([數據字節]) 長度:的sizeof(數據)]]];' – jtromo
最終修復: '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
我很高興你理解了它。我對Assets Library不熟悉,看起來很奇怪,這是獲取原始數據的最佳方式,但看起來你是對的。我將把這個編輯成我的答案,供任何人在未來看到這個問題。 –