首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算ALAsset的CRC校验和

计算ALAsset的CRC校验和
EN

Stack Overflow用户
提问于 2012-06-08 18:36:37
回答 1查看 943关注 0票数 2

我试图计算一个ALAsset的CRC校验和。我的目标是保存所有的CRC,并在以后比较它们,看看资产是否已被更改,但是每次我为同一资产生成一个CRC时,我都会得到不同的结果。

为产生儿童权利委员会:

代码语言:javascript
运行
复制
#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

如何使用:

代码语言:javascript
运行
复制
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时,某些数据是不同的?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-08 18:48:33

这一行:

代码语言:javascript
运行
复制
[assetData setCrc:[CRC32 CRC32Value:[NSData dataWithBytes:&(result) 
                                                   length:sizeof(result)]]];

...is计算ALAsset实例地址的CRC,而不是它的数据。

您可以通过拆分行来验证这一点:

代码语言:javascript
运行
复制
NSData *crcData = [NSData dataWithBytes:&(result) 
                                 length:sizeof(result)];
NSLog( @"crcData length: %d", [crcData length]);
[assetData setCrc:[CRC32 CRC32Value:crcData]];

我的猜测是,在输出中,您将看到crcData length: 4

根据问题问者的后续评论(并作出更正),要这样做的代码是:

代码语言:javascript
运行
复制
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指针。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10954309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档