2

我正在尝试计算 ALAsset 的 CRC 校验和。我的目标是保存所有 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
url: assets-library://asset/asset.JPG?id=BB282CBD-F5B1-4771-B48B-E021224C7384&ext=JPG
文件大小: 1394332
crc: 3605102491
创建时间: 2456085.397025

id:
17826 url: assets-library://asset/asset.JPG?id=BB282CBD-F5B1-4771-B48B-E021224C7384&ext=JPG
文件大小: 1394332
crc: 1383370697
创建时间: 2456085.397025

如您所见,文件大小和 url 相同,但 CRC 不同。

我计算CRC错误吗?或者我应该使用 ALAsset 的不同部分来生成 CRC?也许每次检索 ALAsset 时某些数据都会有所不同?

提前致谢!

4

1 回答 1

1

这一行:

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

...正在计算您的 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 OS X 上为 8),而不是存储在NSData. sizeof()获取NSObject指针没有正常的理由。

于 2012-06-08T18:48:33.543 回答