我需要在我的iOS应用程序中计算CRC32校验和,并在此处找到CRC32计算的帖子,https://stackoverflow.com/a/14533955/691626。从UIImagePickerController读取图像(首先将图像文件发送到电子邮件,然后使用iPhone读取电子邮件并将其保存到相机胶卷,然后使用UIImagePickerController打开文件)
CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
uint32_t result = crc32(0, data.bytes, data.length);
但是,结果与此网站https://defuse.ca/checksums.htm生成的输出(CRC32或CRC32B)不匹配。
使用相同的图像文件,我尝试在Java上验证它
// fileName is the path to the file on local drive, for example, /Users/myName/Documents/myimage.jpg on Mac
Path path = Paths.get(fileName);
byte[] data = Files.readAllBytes(path);
CRC32 checksum = new CRC32();
checksum.update(data, 0, data.length);
result = checksum.getValue();
至少结果可以与验证网站生成的CRC32B匹配。我是否在iOS中错误地使用了库?有人请指教吗?
更新1
做了另一个实验
从captureSession
获取原始数据NSData *rawData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
将原始数据转换为图像
UIImage *originalImage = [[UIImage alloc] initWithData:rawData];
将图像转换为JPEG表示(我正在处理的服务器所需)
NSData *jpegData = UIImageJPEGRepresentation(image, 1.0);
计算NSData jpegData的CRC32校验和
long long checksum1 = crc32(0, jpegData.bytes, jpegData.length);
将NSData jpegData保存到Documents文件夹,重新加载,计算其校验和
[jpegData writeToFile:filePath atomically:YES];
NSData *jpegDataFromDocuments = [NSData dataWithContentsOfFile:filePath];
long long checksum2 = crc32(0, jpegDataFromDocuments.bytes, jpegDataFromDocuments.length);
使用文件管理器重新加载数据,计算其校验和
NSData *jpegDataByFileManager = [[NSFileManager defaultManager] contentsAtPath:filePath];
long long checksum3 = crc32(0, jpegDataByFileManager.bytes, jpegDataByFileManager.length);
我希望看到checksum1和checksum2(或checksum3)的不同值,因为它们以不同的方式读取,但它们都是相同的。并且它们与上面的Java代码计算的值不匹配。
更新2
我尝试将文件添加到资源文件夹并直接从文件夹中读取文件,现在crc 32校验和在Java和iOS上匹配
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myimage" ofType:@"jpg"];
NSData *fileData = [NSData dataWithContentsOfFile:filePath];
uLong crc = crc32(0L, Z_NULL, 0);
long long checksum = crc32(crc, [fileData bytes], [fileData length]);