2013-12-20 1 views
8

Ich konvertiere meine App auf 64-Bit-System zu arbeiten, und ich steckte auf versucht, eine eingebaute CC_SHA1 Methode ordnungsgemäß zu verwenden.So konvertieren/verwenden Sie CC_SHA1-Methode, so dass es in einem 64-Bit-System verwendet werden kann

ich die Warnung:

Implizite Konvertierung verliert integer Präzision: 'NSUInteger' (auch bekannt als 'unsigned long') zu 'CC_LONG' (auch bekannt als 'unsigned int')

Beim Versuch, zu bestehen: data.length in CC_SHA1 Methode.

data.length ist NSUInteger

CC_SHA1 Methodendefinition ist:

extern unsigned char *CC_SHA1(const void *data, CC_LONG len, unsigned char *md) 

wo CC_LONG ein 32 Bit ist unsigned integer.

Wie kann ich es ändern, stattdessen CC_LONG64 zu verwenden?

typedef uint64_t CC_LONG64; 

Dies ist die Umwandlungsmethode, wo ich die obige Warnung erhalten:

+(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

möglich Duplikat [Objective-C Implizite Konvertierung verliert integer Präzision (Größe \ 't zu CC \ _LONG)] (http://stackoverflow.com/questions/17013838/objective- c-implizite-Konvertierung-verliert-Integer-Genauigkeit-Größe-t-zu-cc-lang) – jbouaziz

Antwort

13

Unter der Annahme, dass die Datenlänge kleiner als 2^32, können Sie eine explizite Umwandlung ohne dass Informationen verloren gehen hinzuzufügen. Dies sollte die Warnung entfernen:

CC_SHA1(data.bytes, (CC_LONG)data.length, digest); 
+1

Awesome! Danke @MartinR – Cyprian

+0

@Cyprian: Gern geschehen! –

Verwandte Themen