我试图计算一个ALAsset的CRC校验和。我的目标是保存所有的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
网址: assets-library://asset/asset.JPG?id=BB282CBD-F5B1-4771-B48B-E021224C7384&ext=JPG
文件大小: 1394332
crc: 3605102491
创造时间: 2456085.397025
id: 17826
网址: assets-library://asset/asset.JPG?id=BB282CBD-F5B1-4771-B48B-E021224C7384&ext=JPG
文件大小: 1394332
crc: 1383370697
创造时间: 2456085.397025
正如您所看到的,文件大小和url是相同的,但是CRC是不同的。
我算错了CRC吗?还是应该使用ALAsset的不同部分来生成CRC?也许每次检索ALAsset时,某些数据是不同的?
提前感谢!
发布于 2012-06-08 18:48:33
这一行:
[assetData setCrc:[CRC32 CRC32Value:[NSData dataWithBytes:&(result)
length:sizeof(result)]]];
...is计算ALAsset实例地址的CRC,而不是它的数据。
您可以通过拆分行来验证这一点:
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)
)总是指针的大小( iPhone等32位系统上的4,64位Mac的8),而不是存储在NSData
中的字节数据的长度。没有正常的理由来获得sizeof()
一个NSObject指针。
https://stackoverflow.com/questions/10954309
复制相似问题