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)になり、に格納されているバイトデータの長さではないことに注意してくださいNSDatasizeof()NSObjectポインタを取得する通常の理由はありません。

于 2012-06-08T18:48:33.543 に答える