好吧,我正在拍摄一张图片。众所周知,散列图像需要 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]
];
}
错误在评论行上。
我做错了什么?
答案 0 :(得分:4)
data.bytes
是void *
,所以取消引用它(甚至对其执行必要的指针算法)是没有意义的。
因此,如果您打算从数据中取出一个字节,那么获取指向const unsigned char
的指针并取消引用:
const unsigned char *src = data.bytes;
/* ..then, in your loop.. */
bytes[i] = src[index];
答案 1 :(得分: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:您可能还想按照H2CO3的建议离开const
限定符。这样你就不会意外地写到你不应该去的地方。