NSData转换为NSString返回Null

16

我已经搜索过了,但是还是不明白。

我正在将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>,然后它就可以正常工作了。


在 Stack Overflow 上搜索会得到你需要的答案。 - SomaMan
你好,我该如何接受别人的答案?我尝试点击上方的箭头,但它显示我需要超过15个声望值。 - user774150
3个回答

27

如果编码不正确,就会出现这种情况。

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

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

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

NSASCIIStringEncoding
NSUnicodeStringEncoding
NSISOLatin1StringEncoding
NSISOLatin2StringEncoding
NSSymbolStringEncoding

尝试它们并查看它们是否起作用。


6
我正在将NSData转换成NSString。当我使用[data description];时,它会返回<00000000 31323334 35363738>。是的,我接收到了字符串@"12345678"。

不,你没有接收到该字符串。你接收到的是一个字节序列,以许多0x00值开头,后面跟着一系列恰好对应于ASCII序列"12345678"的字节。

也就是说,你有原始数据,并试图将其转换为受限制的类型,但无法这样做,因为受限制的类型不能表示原始数据。

你可以尝试在NSString上使用“丢失转换”API,但可能无法正常工作,并且无论如何都会很脆弱。

最好的方法是仅将NSData中实际代表字符串的字节转换为NSString实例。这可以使用-initWithBytes:length:encoding:完成;你需要进行计算以找到正确的偏移量和长度。


2
这可能是由于您的数据的前几个字节是00导致的。字符0是字符串结束符。当从ASCII创建字符串(从字符数组或字节数组中创建)时,如果在开头遇到字符0,则会产生一个空字符串。
我希望它返回一个具有0个字符的NSString实例,而不是null。

1
只有 C 字符串才是以 '0x00' 结尾的,对于其他字符串类型,它们通常表示为编码、长度和数据的三元组。这在 NSString 中也是如此;0x00 并不会让它认为字符串已经结束,而是会触发错误,因为 0x00 在字符串中是一个无意义的字节序列。 - bbum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接