Archive for the ‘NSFileHandle’ Category

ファイルのMD5を取得する方法について

NSFileHandleを使用して、ファイルを順に読み込みながら
ファイルを計算する方法を実装してみた。
#ただ単に、MD5計算の途中経過を表示したくてやったんだけど
#(NSProgressIndicatorで経過を表示)

CommonCryptoを使用する
実装方法としては、NSStringのカテゴリで実装している。
ただ、NSStringはファイルパスを表していないといけない。
#エラー処理は書いてません

では、そのソース

  1.  
  2. #import <CommonCrypto/CommonDigest.h>
  3. #define BLOCK 1024 * 1024
  4.  
  5. -(NSString *)GetMD5String{
  6.  
  7.   //MD5の構造体宣言
  8. CC_MD5_CTX c;
  9.  
  10.  
  11. //ファイルハンドル作成
  12. NSFileHandle * handle = [ NSFileHandle fileHandleForReadingAtPath:self ];
  13.  
  14. unsigned char md5_result[CC_MD5_DIGEST_LENGTH];
  15.  
  16. //初期化
  17. CC_MD5_Init(&c);
  18.  
  19. unsigned long long endPos = [ handle seekToEndOfFile ]; //ファイルの終了位置を取得
  20. unsigned long long nowPos = 0; //ファイルの現在の位置
  21. [ handle seekToFileOffset:nowPos ];
  22.  
  23. while( 1 ){
  24.   NSMutableData * data = [ [ NSMutableData alloc ] init ];
  25.     //ファイルの最後までブロック以下か
  26.     if( ( endPos - nowPos ) >= BLOCK ){
  27.      //ファイルを1ブロック読み込む
  28.      [ data setData:[ handle readDataOfLength:BLOCK ] ];
  29.     }else if(  ( endPos - nowPos ) <= 0 ){
  30.      break;
  31.     }else{
  32.      [ data setData:[ handle readDataOfLength:( endPos - nowPos ) ] ];
  33.     }
  34.  
  35.     char* buf[ [ data length ] ];
  36.  
  37.     //読み込んだデータを取得
  38.     [ data getBytes:buf ];
  39.     //MD5値計算
  40.     CC_MD5_Update(&c,buf,[ data length ]);
  41.  
  42.  
  43.     //読み込み位置をデータ分ずらす
  44.     [ handle seekToFileOffset:( nowPos + [ data length ] ) ];
  45.     nowPos = nowPos + [ data length ];
  46.  
  47.     [ data release ];
  48.   }
  49.  
  50.   CC_MD5_Final(md5_result,&c);
  51.  
  52.   //MD5値を文字列で取得する
  53.   NSMutableString * resultStr = [ NSMutableString string ];
  54.   int i;
  55.   for( i=0; i<sizeof(md5_result); i++){
  56.     [ resultStr appendFormat:@"%02X", md5_result[i] ];
  57.   }
  58.  
  59.  
  60.   return resultStr;
  61.  
  62. }
  63.  

上記のソースでMD5の値が取得することができる。
また、ループ文の間に処理を書けば、計算の途中経過を取得することができる。

今回は、ファイルからMD5値を作成したけど、
NSDataやNSStringからMD5値を計算することも可能。