ChatGPT解决这个技术问题 Extra ChatGPT

在Objective c中将NSData转换为NSString

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

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

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

当我看到控制台时,它将打印 null。

@Nik.... @Marvin:你是同一个人还是来自同一个局域网?我只是想知道,为什么您的 identicons 完全相同。
什么是字符串?如果您收到 nil,那么我猜您的数据不是有效的 utf8 字符串?
@vikingosegundo 对于您的友好信息,我不知道尼克...
这真的很有趣,因为这极不可能。但仍有可能。

J
Jhaliya - Praveen Sharma

使用下面的代码。

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

这不会给我正确的字符串
如果不是,则不是 NSASCIIStringEncoding。有关其他编码,请参见 felipes answer
对于这种编码 NSUTF8StringEncoding 给出 nil
C
Cœur

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中的数字。否则它不起作用。谢谢。
注意:如果您不确定自己的编码类型,或者它并不总是相同,那么这种方法对您有好处:stackoverflow.com/a/50691430/2057171
M
Morten Fast

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

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


我将图像转换为 NSdata 并再次使用 NSUTF8StringEncoding 将 NSdata 转换为字符串。但它显示为零。
N
Nag Raj
NSString *string = [NSString stringWithUTF8String:[Data bytes]];

这不像 [[NSString alloc] initWithData:head encoding:NSUTF8StringEncoding] 所描述的那样工作
A
Alexander Volkov

目标 C:

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

迅速:

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

D
DD_

-[NSString initWithData:encoding] 是您的朋友,但前提是您使用正确的编码。


J
Jess

迅速:

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

.utf8 或任何适当的编码


C
Community

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

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

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

完毕!

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

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

A
Andrew Rondeau

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

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];

A
Ashok R

在目标 C 中:

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

这是错误的,它将返回类似 {length = XX, bytes = 0xYYYYYYYY} 的内容,我认为问题是如何从原始字节中解开编码字符串,而不是它们的描述