1

我有一个与钥匙串交互的程序。你传入一个指向 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 都很陌生,void 指针让我陷入循环。在调试模式下,我查看了指针指向的内存,它肯定在那个内存位置。我尝试使用 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 以正确的长度指向那里并让它成为正确的东西。谢谢您的帮助。这个地方很棒!

4

2 回答 2

7

在搜索了苹果网站后,我发现了这个方法:

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

这很好用。

于 2010-12-03T20:31:54.193 回答
1

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

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

变成:

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

于 2013-07-15T19:22:04.783 回答