Приведение void * к NSString * без stringWithCString - PullRequest
1 голос
/ 03 декабря 2010

У меня есть программа, которая взаимодействует с цепочкой для ключей.Вы передаете указатель на пустой указатель, и цепочка для ключей направляет его, я полагаю, на пароль, вы также передаете указатель 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 ]

7 голосов
/ 03 декабря 2010

После очистки веб-сайта Apple я обнаружил метод:

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

, и он прекрасно работает.

1 голос
/ 15 июля 2013

stringWithCString устарела в 10.5 до, но я до сих пор не нашел хорошей замены:

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

становится:

message = [[[NSString alloc] initWithBytes: (буфер + 4) длина: (arg2 -5) кодировка: NSASCIIStringEncoding] autorelease];

...