2013-06-09 25 views
18

Tôi có một chức năng đó là tạo ra một mã hóa sha256 của một chuỗi,Objective-C chuyển đổi ngầm mất nguyên chính xác (size_t để CC_Long)

Dưới đây là các chức năng:

-(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; 
} 

Bây giờ dòng này ngay tại đây CC_SHA256(str, strlen(str), result); là những gì tạo ra cảnh báo này (cảnh báo là cho biến strlen (str)).

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

Tôi đoán tôi chỉ cần chuyển strlen (str) thành CC_Long, nhưng tôi không biết làm cách nào để thực hiện điều đó.

+8

'(CC_LONG) strlen (str)' – mah

+0

Bạn đang sử dụng loại trình biên dịch/chuỗi công cụ và cài đặt nào? Điều này có vẻ giống như một cái gì đó quá mức. –

+2

Nhân tiện, tại sao điều này được gắn thẻ là osx hoặc tự động đếm lại ... chính xác là 0 trong số này nằm trong câu hỏi. – mah

Trả lời

48
  1. Có lẽ đó không phải là lỗi mà là cảnh báo.

  2. "Tôi chỉ cần chuyển đổi strlen (str) thành CC_Long, nhưng tôi không biết làm cách nào để thực hiện điều đó". - chuyển đổi loại rõ ràng (loại đúc): (CC_LONG)strlen(str), nhưng tôi không nghĩ rằng bạn thực sự cần điều này.

+1

nó là một cảnh báo thực sự ... cảnh báo bạn rằng trong lý thuyết size_t có thể lớn hơn CC_Long ... thêm một diễn viên để nói: vâng tôi biết và nó là okay –

+0

@ Daij-Djan Yep, tôi tìm thấy nó hoặc là không hoặc có khả năng hơi say lên nếu một chuỗi dài hơn 4GB (trên OS X 'int' là 4 byte rộng). –

+0

Nó chỉ là một cảnh báo, tuy nhiên ứng dụng của tôi đang phá vỡ trên dòng này mỗi khi tôi chạy nó. – garetmckinley

-9

thay đổi int i-NSUInteger i chế độ im lặng cảnh báo của bạn,

1

Phát biểu từ quan điểm iOS, thực tế là CC_LONG (aka uint32_t) và size_t (unsigned long) là kích thước không phù hợp có thể là một an ninh/ổn định mối quan tâm trong một số ứng dụng, đặc biệt là khi giao dịch với các hàm thư viện có thể tái sử dụng.

Băm MD5 là băm 128 bit của thông báo có độ dài không giới hạn tiềm năng, do đó, có lý do chính đáng cho cảnh báo này. Nếu bạn cắt ngắn độ dài lớn hơn 2^32, bạn sẽ tìm ra một băm không chính xác.

Mã của bạn nên quyết định một cách hợp lý về độ lớn của chuỗi mà nó có thể hỗ trợ. Trong trường hợp này sử dụng CC_MD5, nó sẽ phải là 2^32 byte.

Maximum length for MD5 input/output

0

Mã này sẽ không hiển thị cảnh báo và hoạt động hoàn hảo.

- (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; 
} 
Các vấn đề liên quan