在目标c中将NSData转换为NSString


87

我想将NSData转换为NSString。什么是最好的方法?

我正在使用此代码,但最终字符串返回null

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);

当我看到控制台时,它将输出null。


@Nik .... @Marvin:您是同一个人还是同一局域网内的人?我只是想知道,为什么您的标识完全相同。
vikingosegundo

什么绳子 如果您得到了,nil那么我猜您的数据不是有效的utf8字符串?
deanWombourne 2011年

@vikingosegundo对于您的信息,我不知道...
Mehul Mistri 2011年

这真的很有趣,因为极不可能。但仍然可能。
vikingosegundo

Answers:


47

的文档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
约翰·埃克

我使用了lldb中的数字。否则它不起作用。谢谢。
Okhan Okbay

1
注意:如果您不确定自己的编码类型,或者不确定是否总是相同,则此方法将对您有所帮助:stackoverflow.com/a/50691430/2057171
Albert Renshaw


15

-[NSString initWithData:encoding]nil如果指定的编码与数据的编码不匹配,则将返回。

确保您的数据以UTF-8编码(或将NSUTF8StringEncoding更改为适合该数据的任何编码)。


我将图像转换为NSdata,然后再次使用NSUTF8StringEncoding将NSdata转换为String。但它显示为零。
罗摩克里希纳



2

目标C:

[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

迅速:

let str = String(data: data, encoding: .ascii)

1

迅速:

let jsonString = String(data: jsonData, encoding: .ascii)

.utf8或任何适当的编码


1

不确定数据的编码类型?没问题!

无需知道潜在的编码类型,其中错误的编码类型将为nil / null,这应涵盖您的所有基础:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

做完了!




注意:万一这失败了,您可以使用来解压缩NSData NSKeyedUnarchiver ,然后(id)unpacked通过再次重新打包NSKeyedArchiver,并且NSData形式应该是base64可编码的。

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];

0

在目标C中:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)

这是错误的,它将返回类似的内容,{length = XX, bytes = 0xYYYYYYYY}并且我假设问题是如何从原始字节解包编码的字符串,而不是对其进行描述
raistlin

0

目标C包含一种内置方法来检测NSData中嵌入的字符串的编码。

NSData* data = // Assign your NSData object...

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.