我想将NSData转换为NSString。什么是最好的方法?
我正在使用此代码,但最终字符串返回null
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
当我看到控制台时,它将输出null。
我想将NSData转换为NSString。什么是最好的方法?
我正在使用此代码,但最终字符串返回null
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
当我看到控制台时,它将输出null。
nil
那么我猜您的数据不是有效的utf8字符串?
Answers:
的文档NSString
说
https://developer.apple.com/documentation/foundation/nsstring/1416374-initwithdata
返回值通过使用编码将数据中的字节转换为Unicode字符而初始化的NSString对象。返回的对象可能与原始接收者不同。如果初始化由于某种原因而失败(例如,如果数据不代表有效的编码数据),则返回nil。
您应该尝试其他编码,以检查是否可以解决您的问题
// The following constants are provided by NSString as possible string encodings.
enum {
NSASCIIStringEncoding = 1,
NSNEXTSTEPStringEncoding = 2,
NSJapaneseEUCStringEncoding = 3,
NSUTF8StringEncoding = 4,
NSISOLatin1StringEncoding = 5,
NSSymbolStringEncoding = 6,
NSNonLossyASCIIStringEncoding = 7,
NSShiftJISStringEncoding = 8,
NSISOLatin2StringEncoding = 9,
NSUnicodeStringEncoding = 10,
NSWindowsCP1251StringEncoding = 11,
NSWindowsCP1252StringEncoding = 12,
NSWindowsCP1253StringEncoding = 13,
NSWindowsCP1254StringEncoding = 14,
NSWindowsCP1250StringEncoding = 15,
NSISO2022JPStringEncoding = 21,
NSMacOSRomanStringEncoding = 30,
NSUTF16StringEncoding = NSUnicodeStringEncoding,
NSUTF16BigEndianStringEncoding = 0x90000100,
NSUTF16LittleEndianStringEncoding = 0x94000100,
NSUTF32StringEncoding = 0x8c000100,
NSUTF32BigEndianStringEncoding = 0x98000100,
NSUTF32LittleEndianStringEncoding = 0x9c000100,
NSProprietaryStringEncoding = 65536
};
NSASCIIStringEncoding
使用下面的代码。
NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
NSASCIIStringEncoding
。有关其他编码,请参见felipes的答案
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
-[NSString initWithData:encoding]
是您的朋友,但仅当您使用正确的编码时才可以。
无需知道潜在的编码类型,其中错误的编码类型将为nil / null,这应涵盖您的所有基础:
NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
做完了!
注意:万一这失败了,您可以使用来解压缩NSData NSKeyedUnarchiver
,然后(id)unpacked
通过再次重新打包NSKeyedArchiver
,并且NSData形式应该是base64可编码的。
id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];