Я пытаюсь вычислить контрольную сумму CRC для ALAsset. Моя цель - сохранить все CRC и сравнить их позже, чтобы узнать, был ли актив изменен, но каждый раз, когда я генерирую CRC для одного и того же актива, у меня получается другой результат.Расчет контрольной суммы CRC для ALAsset
Для генерации 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
URL: активы-библиотека: //asset/asset.JPG ID = BB282CBD-F5B1-4771-B48B -E021224C7384 & внутр = JPG
размер файла: 1394332
CRC: 1383370697
CreationTime: 2456085,397025
Как вы можете видеть, файлы и URL-адреса являются одинаковыми, но CRC отличается.
Я исчисляю CRC неправильно? Или я должен использовать другую часть ALAsset для генерации CRC? Возможно, некоторые данные различаются при каждом восстановлении ALAsset?
Заранее благодарен!
спасибо! Какая простая ошибка. Я снова использовал другой код, который использовал адрес, и забыл его вынуть. Здесь была ошибка: '[assetData setCrc: [CRC32 CRC32Value: [NSData dataWithBytes: ([байт данных]) длина: SizeOf (данные)]]],' – jtromo
Окончательное исправление: 'ALAssetRepresentation * респ = [result defaultRepresentation]; Байт * buffer = (Byte *) malloc (rep.size); NSUInteger buffered = [rep getBytes: buffer fromOffset: 0.0 length: rep.size error: nil]; NSData * data = [NSData dataWithBytesNoCopy: длина буфера: буферизированная freeWhenDone: YES]; [assetData setCrc: [CRC32 CRC32Value: [NSData dataWithBytes: ([data bytes]) length: sizeof (data)]]]; ' – jtromo
Я рад, что вы это поняли. Я не знаком с Библиотекой активов, и кажется странным, что это лучший способ получить необработанные данные, но похоже, что вы правы. Я собираюсь изменить это в свой ответ для тех, кто смотрит на этот вопрос в будущем. –