15

我已经搜索过了。但是还是拿不到。

我正在将 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];

两者都返回我null。任何想法?谢谢

大家好,感谢所有建议。它似乎是恒定的,因此前面总是有一个空字符。所以每当我收到东西时,我只需删除第一个 <00000000>,然后它就可以正常工作了

4

3 回答 3

27

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

尝试使用 ASCII 进行测试。ASCII 几乎可以肯定可以检索某种字符串。如果只是数字,它可能会起作用。

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

除 UTF-8 编码外,最常见的是:

NSASCIIStringEncoding
NSUnicodeStringEncoding
NSISOLatin1StringEncoding
NSISOLatin2StringEncoding
NSSymbolStringEncoding

尝试一下,看看它们是否有效。

于 2012-04-16T17:50:43.240 回答
6

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

不——你没有收到那个字符串。您正在接收一个字节序列,该字节序列以一堆 0x00 值开头,然后是一系列恰好对应于 ASCII 序列“12345678”的字节。

即您有原始数据并试图将其转换为受约束的类型,但不能因为受约束的类型不能代表原始数据。

您可以尝试在 NSString 上使用“有损转换”API,但这可能不起作用并且无论如何都会很脆弱。

最好的选择?

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

于 2012-04-16T17:57:39.233 回答
2

这可能是因为数据的第一个字节是 00。字符 0 是字符串字符的结尾。当从 ASCII 创建一个字符串时(从一个字符数组或一个字节数组,就像你正在做的那样),当字符 0 在开头遇到时,它会产生一个空字符串。

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

于 2012-04-16T17:59:50.337 回答