Как использовать символ NULL с NSString? - PullRequest
4 голосов
/ 21 января 2010

В PHP я могу вызвать base64_encode("\x00". $username. "\x00". $password), а "\x00" представляет символ NULL.

Теперь в Objective-C у меня есть функция, которая преобразует NSData в кодированную base64 NSString , созданную DaveDribin.

Как создать данные из строки, содержащей символы NULL?

Кажется, это не работает ...

NSData * authCode = [[NSString stringWithFormat:@"%c%@%c%@", '\0', self.username, '\0', self.password] dataUsingEncoding:NSUTF8StringEncoding];

Ответы [ 5 ]

4 голосов
/ 22 января 2010

Как это:

char bytes[] = "\0username\0password";
NSData * data = [NSData dataWithBytes:bytes length:sizeof(bytes)];

NSLog(@"%@", data);

Выход:

2010-01-22 09:15:22.546 app[6443] <00757365 726e616d 65007061 7373776f 726400>

Или от NSString:

char bytes[] = "\0username\0password";
NSString * string = [[NSString alloc] initWithBytes:bytes length:sizeof(bytes) encoding:NSUTF8StringEncoding];
NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];

Вы можете видеть нулевые байты в начале, между именем пользователя / паролем и в конце - потому что char[] имеет нулевое значение.

1 голос
/ 22 января 2010

Ваш синтаксис правильный. NSString просто плохо обрабатывает NULL байт. Я не могу найти какую-либо документацию по этому поводу, но NSString будет молча игнорировать спецификаторы формата %c с аргументом 0 (и на этом примечании символьная константа '\0' расширяется до целого числа 0; это правильно ). Однако он может обрабатывать \0, непосредственно встроенный в литерал NSString.

См. Этот код:

#import <Cocoa/Cocoa.h>
int main (int argc, char const *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *stringByChars = [NSString stringWithFormat:@"-%c%c%c%c-",0,0,0,0];
    NSString *stringByEscapes = [NSString stringWithFormat:@"-\0\0\0\0-"];
    NSLog(@"  stringByChars: \"%@\"", stringByChars);
    NSLog(@"            len: %d", [stringByChars length]);
    NSLog(@"           data: %@", [stringByChars dataUsingEncoding:NSUTF8StringEncoding]);
    NSLog(@"stringByEscapes: \"%@\"", stringByEscapes);
    NSLog(@"            len: %d", [stringByEscapes length]);
    NSLog(@"           data: %@", [stringByEscapes dataUsingEncoding:NSUTF8StringEncoding]);
    [pool drain];
    return 0;
}

возвращается:

  stringByChars: "--"
            len: 2
           data: <2d2d>
stringByEscapes: "-
            len: 6
           data: <2d000000 002d>

(Обратите внимание, что поскольку stringByEscapes на самом деле содержит NULL байтов, он рано завершает строку NSLog).

0 голосов
/ 12 июля 2011

Вы также можете попробовать это (проверено и работает - взято из: http://www.cocoabuilder.com/archive/cocoa/174917-nul-characters-in-nsstring-cause-unexpected-results.html)

NSString* s1 = [[NSString alloc] initWithBytes:buffer length:sizeof (buffer)
      encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF16LE)]; // @"A[NUL]end" (*)
NSLog(@"s1 = %@", s1);
NSString* s2 = @"CD";
NSLog(@"s2 = %@", s2) ;
NSString* sC = [s1 stringByAppendingString:s2];
NSLog(@"sC = %@", sC);
NSLog(@"length of s1:%i", [s1 length]);
NSLog(@"length of s2:%i", [s2 length]);
NSLog(@"length of sC:%i", [sC length]);
[s1 release];
0 голосов
/ 22 января 2010

ответ stefanB выглядит как правильный вариант. Оказывается, я передал неверную информацию, чтобы она выглядела так, будто \ 0 не работает

Это было нормально:

[NSString stringWithFormat:@"\0user\0pass"]
0 голосов
/ 21 января 2010

Не совсем уверен, почему это работает, но вместо использования @ "% c" в качестве строки формата с '\ 0', попробуйте использовать @ "% @" в качестве строки формата с @ "\ 0"

...