2012-04-16 171 views
13

我已经搜索过。但仍然无法得到它。NSData返回NSString Null

我正在将NSdata转换为NSString。 当我做[data description]; 它返回我< 00000000 31323334 35363738> 是的,我收到我的字符串@“12345678”。

如何正确地将它转换为NSString? 我试过

NSString *b = [NSString stringWithUTF8String:[data bytes]]; 
NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding]; 

两者都返回空。 有什么想法? 谢谢

大家好, 谢谢你的所有建议。 它似乎是不变的,因为它总是一个空角色infront。 所以每当我收到东西,我只是删除第一个< 00000000>,那么它已经正常工作

+0

在SO搜索将得到您的答案 – SomaMan 2012-04-16 17:51:49

+0

您好,我该如何接受人们的答案?我尝试点击向上键,但它说我需要超过15的声誉 – user774150 2012-04-17 02:28:21

回答

26

如果编码不正确,会发生这种情况。

尝试使用ASCII码进行测试。 ASCII几乎肯定能够检索一些字符串。如果它只是数字,它可能会工作。

NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding]; 

最常见的除了UTF-8 enconding是:

NSASCIIStringEncoding 
NSUnicodeStringEncoding 
NSISOLatin1StringEncoding 
NSISOLatin2StringEncoding 
NSSymbolStringEncoding 

尝试出来,看看他们的工作。

+1

NSASCIIStringEncoding为我工作。谢谢。 – 2015-09-19 14:09:44

6

我将NSdata转换为NSString。当我做[数据说明];它 返回我< 00000000 31323334 35363738>是的,我收到我的字符串 @“12345678”。

否 - 您没有收到该字符串。您正在接收一个以一串0x00值开始的字节序列,后面紧跟着一系列与ASCII序列“12345678”相对应的字节。

I.e.你有原始数据,并试图将其转换为受限类型,但不能,因为约束类型不能表示原始数据。

您可以尝试在NSString上使用“有损转换”API,但这可能无法正常工作,并且无论如何都会变得脆弱。

最佳投注?

只将实际表示字符串的NSData中的字节转换为NSString的实例。这可以通过-initWithBytes:length:encoding:来完成;您需要进行计算以找到正确的偏移量和长度。

2

这可能是因为您的数据的第一个字节是00.字符0是字符串字符的结尾。当从ASCII(从字符数组或字节数组)创建一个字符串时,如果在开始时遇到字符0,它将生成一个空字符串。

但我期望它返回一个NSString的实例,它包含0个字符,而不是null。

+1

如果一个字符串是一个C字符串,那么该字符串仅以'0x00'结尾。对于其他字符串类型,它们通常表示为编码,长度和数据的三倍。 NSString就是这种情况; 0x00's不会欺骗它,认为字符串被终止,它们正在触发错误,因为0x00是字符串中没有意义的字节序列。 – bbum 2012-04-16 19:32:02