2011-11-05 62 views
4

我有一個字符串,我想要一個字節數組。到目前爲止,我已經使用NSData的做到這一點:如何使用NSString getBytes:maxLength:usedLength:encoding:options:range:remainingRange:

NSString *message = @"testing"; 
NSData *messageData = [message dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:YES]; 
NSUInteger dataLength = [messageData length]; 
Byte *byteData = (Byte*)malloc(dataLength); 
memcpy(byteData, [messageData bytes], dataLength); 

但是,我知道的NSString有getBytes:maxLength:usedLength:encoding:options:range:remainingRange:方法,讓我用NSData的一起跳過。我的問題是,我不知道如何正確設置所有參數。

我假設傳入的指針數組必須是malloc'ed - 但我不知道如何找到多少內存malloc。我知道有[NSString lengthOfBytesUsingEncoding:][NSString maximumLengthOfBytesUsingEncoding:],但我不知道這些是我需要使用的方法,並沒有完全理解它們之間的區別。我認爲這將是給予maxLength相同的價值。其餘的參數從文檔中是有意義的。任何幫助都會很棒。謝謝。

回答

5

lengthOfBytesUsingEncoding:maximumLengthOfBytesUsingEncoding:之間的區別在於前者是精確但是很慢(O(n)),而後者很快(O(1)),但可能會返回比實際需要的字節數量多得多的字節。 maximumLengthOfBytesUsingEncoding:給出的唯一保證是返回值將足夠大以包含字符串的字節。

通常,您的假設是正確的。所以方法應該像這樣使用:

NSUInteger numberOfBytes = [message lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]; 
void *buffer = malloc(numberOfBytes); 
NSUInteger usedLength = 0; 
NSRange range = NSMakeRange(0, [message length]); 
BOOL result = [message getBytes:buffer maxLength:numberOfBytes usedLength:&usedLength encoding:NSUnicodeStringEncoding options:0 range:range remainingRange:NULL]; 
... 
free(buffer);