我有一个与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以适当的长度指向那里,让它成为正确的东西。谢谢您的帮助。这个地方很棒!
答案 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];