2014-10-20 90 views
1

當我的NSString轉換爲NSData的,後我得到一個零結果的NSString NSData的返回nil

NSString * test = @"Wft0r3qkzXd5TDBeCahUB3MtHuc8Axwr"; 

NSData * testData = [test dataUsingEncoding:NSUTF8StringEncoding]; 

NSString * result = [NSString stringWithUTF8String:[testData bytes]]; 

Printing description of testData: 
<57667430 7233716b 7a586435 54444265 43616855 42334d74 48756338 41787772> 
Printing description of result: 
<nil> 

回答

3

我相信你正在尋找這種方法:

- (instancetype)initWithData:(NSData *)data 
        encoding:(NSStringEncoding)encoding 

從蘋果文檔是在這裏:NSString class reference

+0

是不是一樣的stringWithUTF8String? – 2014-10-20 17:25:32

+1

不,stringWithUTF8String需要const char *作爲它的輸入參數(A C UTF8編碼字節數組): ' - (instancetype)initWithUTF8String:(const char *)bytes'我不相信NSData。無論如何,你有什麼理由想在'initWithData:encoding:'方法之上使用'stringWithUTF8String'嗎? :)對我來說,就像他們被設計成一起工作;) – simonthumper 2014-10-20 17:29:38

+0

DAMMIT這是如此怪異的誤導,他們應該命名它stringWithUTF8CString – 2014-10-20 17:31:32

3

在斯威夫特,你可以看到從字符串的往返數據串如下:

let srcString = "Wft0r3qkzXd5TDBeCahUB3MtHuc8Axwr" 
let stringAsData = srcString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 
let dstString = NSString(data: stringAsData, encoding: NSUTF8StringEncoding)! 
dstString // => "Wft0r3qkzXd5TDBeCahUB3MtHuc8Axwr" 

基本上,你要使用NSString(data:NSData,encoding:UInt)NSString(UTF8String:UnsafePointer<Int8>)

NSData是一個Cocoa對象,它包裝了一個字節緩衝區。但是你使用的方法需要一個UnsafePointer<Int8>,換句話說,一個原始指針,它只是一個數字內存地址,指向一個字節數組的開始。

0

斯威夫特3

let string = "aHft0r3qkzjuh5rdsaeCahUB3MtHuc8Axwrfdvxgf" 
    let stringData = string.data(using: String.Encoding.utf8, allowLossyConversion: false)! 
    let finalString = NSString(data: stringData, encoding: String.Encoding.utf8.rawValue)!;