Atto_ 2014-08-08 04:24 采纳率: 0%
浏览 4310

如何计算位于iOS相册中图片的正确md5值

具体情况

在OS X下,计算得的正确md5值是:63e3fbe6 a0438f26 e49e5dab 1c4af0d3。

NSData *temp = [[NSData alloc] initWithContentsOfFile:@"/Users/apple/Pictures/temp/tu7.png"];
NSLog(@"md5: %@", [temp md5]);

在iOS中,UIImagePickerControllerDelegate协议,imagePickerController: didFinishPickingMediaWithInfo:方法,计算的的md5值是:55ea2f62 5df31067 683aa9a8 3a06d420。

UIImage *image = info[UIImagePickerControllerOriginalImage];
NSData *temp = UIImagePNGRepresentation(image);
NSLog(@"md5: %@", [temp md5]);

两个md5值结果不一样,我希望计算图片整个文件的md5,因为要拿这个md5值与服务器上贮存的图片进行比对,服务器上图片文件计算得md5与通过绝对路径计算得md5相同,所以我尝试获取被选中图片的路径,像/Users/apple/Pictures/temp/tu7.png这种形式的,我知道通过info可以获取asset library url。

NSURL *imgurl = [info objectForKey:UIImagePickerControllerReferenceURL];

获得的结果是像assets-library://asset/asset.JPG?id=00000000-0000-0000-0000-00000000007E&ext=JPG这种形式的。

  1. 有什么方法可以把asset library url变成绝对路径,也就是 形式assets-library://asset/asset.JPG?id=00000000-0000-0000-0000-00000000007E&ext=JPG -> 形式/Users/apple/Pictures/temp/tu7.png 的转变?
  2. 如果没有,有什么方法可以决解这个问题?能否提供提供决解思路?
  • 写回答

1条回答 默认 最新

  • weixin_36809389 2016-11-24 06:54
    关注
    • (NSString *)fileMD5WithAsset:(ALAsset *)asset
      {
      if (!asset) {
      return nil;
      }

      ALAssetRepresentation *rep = [asset defaultRepresentation];
      unsigned long readStep = 256;
      uint8_t *buffer = calloc(readStep, sizeof(*buffer));
      unsigned long long offset = 0;
      unsigned long long bytesRead = 0;
      NSError *error = nil;
      unsigned long long fileSize = [rep size];
      int chunks = (int)((fileSize + readStep - 1)/readStep);
      unsigned long long lastChunkSize = fileSize%readStep;

      CC_MD5_CTX md5;
      CC_MD5_Init(&md5);
      BOOL isExp = NO;
      int currentChunk = 0;
      while(!isExp && currentChunk < chunks){
      @try {
      if(currentChunk < chunks - 1){
      bytesRead = [rep getBytes:buffer fromOffset:offset length:(unsigned long)readStep error:&error];
      }else{
      bytesRead = [rep getBytes:buffer fromOffset:offset length:(unsigned long)lastChunkSize error:&error];
      }
      NSData * fileData = [NSData dataWithBytesNoCopy:buffer length:(unsigned long)bytesRead freeWhenDone:NO];
      CC_MD5_Update(&md5, [fileData bytes], (CC_LONG)[fileData length]);
      offset += readStep;
      } @catch(NSException exception) {
      isExp = YES;
      free(buffer);
      }
      currentChunk += 1;
      }
      unsigned char digest[CC_MD5_DIGEST_LENGTH];
      CC_MD5_Final(digest, &md5);
      NSString
      s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
      digest[0], digest[1],
      digest[2], digest[3],
      digest[4], digest[5],
      digest[6], digest[7],
      digest[8], digest[9],
      digest[10], digest[11],
      digest[12], digest[13],
      digest[14], digest[15]];
      return s;
      }

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题