我正在将我的应用转换为在64位系统上工作,并且我一直试图正确使用内置的CC_SHA1
方法。
我收到警告:
隐式转换失去整数精度:'NSUInteger'(又名'unsigned long')到'CC_LONG'(又名'unsigned int')
尝试在data.length
方法中传递CC_SHA1
。
data.length
是NSUInteger
CC_SHA1
方法定义是:
extern unsigned char *CC_SHA1(const void *data, CC_LONG len, unsigned char *md)
其中CC_LONG
是32位unsigned integer
。
如何更改它以使用CC_LONG64
?
typedef uint64_t CC_LONG64;
这是我收到上述警告的转换方法:
+(NSString*)sha1:(NSString*)input
{
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(NSInteger i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
答案 0 :(得分:14)
假设数据长度小于2^32
,您可以添加
明确的演员而不会丢失任何信息。
这应该删除警告:
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);