Your syntax is correct. NSString just does not handle NULL bytes. I cannot find documentation about this, but NSString silently ignores %c format specifiers with argument 0 (and in this note the character constant '\0' expands to integer 0 , which is true). However, it can handle \0 directly embedded in the NSString literal.
See this code:
#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; }
returns:
stringByChars: "--" len: 2 data: <2d2d> stringByEscapes: "- len: 6 data: <2d000000 002d>
(Note: since stringByEscapes actually contains NULL bytes, it ends the NSLog string early).
source share