2013-08-27 1 views
1

Хорошо, я передаю изображение. И, как вы все знаете, хеширование изображения занимает FOREVER. Поэтому я принимаю 100 образцов изображения, равномерно распределенных. Вот код.Кастинг от const void до char?

#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

data.bytes - void *, поэтому нет смысла разыменовывать его (или даже выполнять необходимую арифметику указателя на нем).

Так что, если вы имели в виду взять байт из данных, а затем получить указатель на const unsigned char и разыменования, что:

const unsigned char *src = data.bytes; 
/* ..then, in your loop.. */ 
bytes[i] = src[index]; 

О, и do not cast the return value of malloc()!

+0

Спасибо! Тем не менее, я обнаружил, что выполнение байтов [i] = & data.bytes [index] было немного чище. И мой профессор компьютерных наук сказал мне, что хорошей практикой является бросок маллоков. Идите фигуру. – rweichler

+0

@rweichler он ошибается. Также этот код выглядит некорректным ... –

1

В соответствии с документацией по NSData, data.bytes возвращает тип const void *. В принципе, вы пытаетесь получить доступ к указателю на void, который не имеет смысла, так как void не имеет размера.

Отдайте его указателю на символ и разыщите его.

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

или

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

Edit: Что я обычно делаю это присвоить указатель на известного типа данных сразу и использовать вместо.

I.e.

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

Edit2: Вы также можете оставить const спецификатор в как это было предложено Н2СО3. Таким образом, вы не будете случайно писать в том месте, где вы не должны.

+0

Еще лучше: '((const char *) data.bytes) [index]'; даже немного лучше: '((const unsigned char *) data.bytes) [index]' perfect: 'const unsigned char * bytes = data.bytes; байты [индекс]; ' –