在没有stringWithCString的情况下将void *转换为NSString *

时间:2010-12-03 19:22:40

标签: objective-c nsstring keychain void-pointers

我有一个与Keychain交互的程序。你传入一个指向void指针的指针,钥匙链将它指向密码,你也传入一个UInt32指针,它将指向密码的长度。

然后我需要将其用作NSString,我试图直接将其转换为此类但是它聚合了更多的位然后需要,这对密码不起作用。我试着用:

NSString* password=[NSString stringWithCharacters:passwordData length:passwordLength];

将密码更改为中文字符。不知道为什么。当我在调试模式下打印描述时,它给了我:

Printing description of password:
\u3039\u4839\u6d6f\u2165\u1566�

我能够完美地使用它:

NSString* password=[NSString stringWithCString:passwordData length:passwordLength];

但这是折旧的,我想避免使用它。我对C和Objective-C都很新,而且无效指针会引发我的循环。在调试模式下,我查看了指针指向的内存,它肯定在该内存位置。我尝试使用const char *但它不喜欢说变量可能没有被初始化。

以下是我用来获取钥匙串的方法

- (OSStatus) GetPasswordKeychain:(void*)passwordData length:(UInt32*)passwordLength label:(NSString*)serverName
{
 status=SecKeychainFindGenericPassword(NULL, (UInt32)[serverName length], [serverName UTF8String], usernameLength, username,passwordLength , passwordData, NULL);
return status;
}

有没有办法让NSString以适当的长度指向那里,让它成为正确的东西。谢谢您的帮助。这个地方很棒!

2 个答案:

答案 0 :(得分:7)

经过淘汰the Apple website后,我发现了这个方法:

- (id)initWithBytes:(const void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding

这很有效。

答案 1 :(得分:1)

stringWithCString已在10.5中折旧,但直到现在我才找到一个不错的替代品:

message = [NSString stringWithCString:(buffer + 4)length:(arg2 -5)];

变为:

message = [[[NSString alloc] initWithBytes:(buffer + 4)length:(arg2 -5)encoding:NSASCIIStringEncoding] autorelease];