2013-06-09 10 views
18

Ich habe eine Funktion, die eine sha256 Verschlüsselung einer Zeichenfolge ist zu erzeugen,Objective-C Implizite Konvertierung verliert integer Präzision (size_t bis CC_Long)

Hier ist die Funktion:

-(NSString*)sha256HashFor:(NSString*)input 
{ 
    const char* str = [input UTF8String]; 
    unsigned char result[CC_SHA256_DIGEST_LENGTH]; 
    CC_SHA256(str, strlen(str), result); 

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2]; 
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) 
    { 
     [ret appendFormat:@"%02x",result[i]]; 
    } 
    return ret; 
} 

jetzt hier diese Linie CC_SHA256(str, strlen(str), result); ist das, was diese Warnung erzeugt (die Warnung ist für die Variable strlen (str)).

Implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'CC_LONG' (aka 'unsigned int') 

Ich vermute, ich brauche nur die strlen (str) zu einem CC_Long konvertieren, aber ich habe keine Ahnung, wie das zu tun.

+8

'(CC_LONG) strlen (str)' – mah

+0

Welche Art von Compiler/Toolchain und Einstellungen verwenden Sie? Dies scheint etwas übermäßig pedantisch zu sein. –

+2

Übrigens, warum würde dies markiert werden osx oder automatisch-Ref-Zählen ... genau Null von diesen beiden ist in der Frage. – mah

Antwort

48
  1. Vermutlich ist das kein Fehler, sondern eine Warnung.

  2. "Ich muss nur die strlen (str) in eine CC_Long konvertieren, aber ich habe keine Ahnung, wie das geht." - explizite Typumwandlung (Typ Casting): (CC_LONG)strlen(str), aber ich glaube nicht, dass du das wirklich brauchst.

+1

es ist eine Warnung in der Tat ... warnt Sie, dass in der Theorie die size_t könnte größer sein als die CC_Long ... eine Besetzung hinzufügen, um zu sagen: Ja, ich weiß und es ist in Ordnung –

+0

@ Daij-Djan Ja, ich finde es entweder unwahrscheinlich oder möglicherweise vermasselt, wenn ein String mehr als 4 GB lang ist (auf OS X 'int' ist 4 Bytes breit). –

+0

Es war nur eine Warnung, aber meine App bricht jedes Mal in dieser Zeile, wenn ich sie starte. – garetmckinley

-9

Ihre int i-NSUInteger i zu schweigen die Warnung ändern,

1

aus der Perspektive iOS Sprechen, die Tatsache, dass CC_LONG (aka uint32_t) und size_t (unsigned long) sind inkompatibel Größen eine Sicherheit/Stabilität sein kann Bedenken in einigen Anwendungen, insbesondere wenn es sich um wiederverwendbare Bibliotheksfunktionen handelt.

Ein MD5-Hash ist ein 128-Bit-Hash einer Nachricht mit möglicherweise unbegrenzter Länge. Es gibt also einen guten Grund für diese Warnung. Wenn Sie eine Länge größer als 2^32 abschneiden, erhalten Sie einen falschen Hash.

Ihr Code sollte logisch entscheiden, wie groß eine Zeichenkette ist, die er unterstützen kann. In diesem Fall müsste CC_MD5 2^32 Bytes haben.

Maximum length for MD5 input/output

0

Dieser Code zeigt keine Warnung und funktioniert perfekt.

- (NSString*) sha256 { 
    const char * pointer = [self UTF8String]; 
    unsigned char result[CC_SHA256_DIGEST_LENGTH]; 
    CC_SHA256(pointer, (CC_LONG)strlen(pointer), result); 

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2]; 
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) 
    { 
     [ret appendFormat:@"%02x",result[i]]; 
    } 
    return ret; 
} 
Verwandte Themen