1

画像をハッシュしています。ご存知のように、画像のハッシュにはFOREVERがかかります。そのため、均等な間隔で 100 個の画像サンプルを取得しています。これがコードです。

#define NUM_HASH_SAMPLES 100

@implementation UIImage(Powow)

-(NSString *)md5Hash
{
    NSData *data = UIImagePNGRepresentation(self);

    char *bytes = (char*)malloc(NUM_HASH_SAMPLES*sizeof(char));
    for(int i = 0; i < NUM_HASH_SAMPLES; i++)
    {
        int index = i*data.length/NUM_HASH_SAMPLES;

        bytes[i] = (char)(data.bytes[index]); //Operand of type 'const void' where arithmetic or pointer type is required
    }

    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5( bytes, NUM_HASH_SAMPLES, result );
    return [NSString stringWithFormat:
            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ];
}

エラーはコメント行にあります。

私は何を間違っていますか?

4

2 に答える 2

1

NSData のドキュメントによると、data.bytesの型を返しますconst void *void基本的に、サイズがないため意味のないポインタにアクセスしようとしてvoidいます。

それを char ポインターにキャストし、逆参照します。

((const char *)data.bytes)[index]

また

*((const char *)data.bytes + index)

編集:私が通常行うことは、ポインターを既知のデータ型にすぐに割り当て、代わりにそれを使用することです。

いえ

const char *src = data.bytes;
bytes[i] = src[index];

Edit2: H2CO3constで提案されているように、修飾子をそのままにしておくこともできます。そうすれば、誤って書き込みを行うべきではない場所に書き込むことがなくなります。

于 2013-08-27T08:50:32.900 に答える