2012-03-09 6 views
1

私はどこに行っても問題を解決できません。私はAndroidとWindowsの両方のプログラムで、与えられた画像のSHA1ハッシュを計算しました。私はダウンロードしたHashCalcでこれらのハッシュを確認しました。しかし、私はiPhoneのために同じことをしようとすると、私は完全に異なるハッシュを取得します。私はハッシュを計算する前にイメージをバイト配列に変換することと関係があると信じています。私はここでの問題は、あなたがUIImageJPEGRepresentation()を使用してデータを変換していることである疑いがあるiPhoneで(画像の)SHA1を生成しますか? (間違った結果)

- (void)imagePickerCotroller:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
[imageview setImage:image]; 

NSData* imageData = UIImageJPEGRepresentation(image, 1); 
NSString *hash = makeSHA1(imageData); 

[filepath setText: hash]; 
[self dismissModalViewControllerAnimated:YES]; 
} 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 

[self dismissModalViewControllerAnimated:YES]; 
} 


NSString* makeSHA1(NSData *data) {  

uint8_t digest[CC_SHA1_DIGEST_LENGTH]; 

CC_SHA1(data.bytes, data.length, digest);  

NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];  

for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) 
    [output appendFormat:@"%02x", digest[i]];  
return output; 
} 

答えて

1

:ここに私のコードです。あなたがJPEGデータで始まったとしても、これはあなたが始めたものとまったく同じバイトを返すという約束はありません。

私の(未テストの)提案は、CGDataProviderに生データを依頼することです。このようなもの:

CGImageRef cgImage = [image CGImage]; 
CGDataProviderRef provider = CGImageGetDataProvider(cgImage); 
CFDataRef imageData = CGDataProviderCopyData(provider); 
if (imageData != NULL) { 
    ... 
    CFRelease(imageData); 
} 
+0

これは間違ったハッシュ – silentBeep