Skip to content

Instantly share code, notes, and snippets.

@s-shin
Last active August 29, 2015 14:08
Show Gist options
  • Select an option

  • Save s-shin/2d5d84f3c6c27c508df0 to your computer and use it in GitHub Desktop.

Select an option

Save s-shin/2d5d84f3c6c27c508df0 to your computer and use it in GitHub Desktop.
//
// Behavior of NSString with NULL character tail-padding.
//
// **I thought this behavior is wrong, but now, I see it's correct as NSString.**
//
// Usage:
// $ gcc nsstring-null-tail-padding.m -framework Foundation
// $ ./a.out
//
#import <Foundation/Foundation.h>
@interface Exp : NSObject
@end
@implementation Exp
+ (void)exp1
{
NSString *str1 = @"abcdefg";
NSData *data1 = [str1 dataUsingEncoding:NSUTF8StringEncoding];
NSData *data2 = [NSData dataWithBytes:data1.bytes length:data1.length+4]; // append NULL char
NSString *str2 = [[NSString alloc] initWithData:data2 encoding:NSUTF8StringEncoding]; // no error
NSLog(@"str1:%lu: %@", str1.length, str1); // => str1:7: abcdefg
NSLog(@"data1:%lu: %@", data1.length, data1); // => data1:7: <61626364 656667>
NSLog(@"data2:%lu: %@", data2.length, data2); // => data2:11: <61626364 65666700 000000>
NSLog(@"str2:%lu: %@", str2.length, str2); // => str2:11: abcdefg
}
+ (NSString *)generatePaddingStringWithString:(NSString *)str paddingSize:(int)paddingSize
{
NSData *d = [str dataUsingEncoding:NSUTF8StringEncoding];
d = [NSData dataWithBytes:d.bytes length:d.length+paddingSize];
return [[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding];
}
+ (void)exp2
{
NSString *s1 = @"foo";
NSString *s2 = @"bar";
NSString *s3 = [s1 stringByReplacingCharactersInRange:NSMakeRange(1, 1) withString:s2];
NSLog(@"s1:%lu: %@", s1.length, s1); // => s1:3: foo
NSLog(@"s2:%lu: %@ ", s2.length, s2); // => s2:3: bar
NSLog(@"s3:%lu: %@", s3.length, s3); // => s3:5: fbaro # ok
}
+ (void)exp3
{
NSString *s1 = [self generatePaddingStringWithString:@"foo" paddingSize:3];
NSString *s2 = [self generatePaddingStringWithString:@"bar" paddingSize:3];
NSString *s3 = [s1 stringByReplacingCharactersInRange:NSMakeRange(1, 1) withString:s2];
NSLog(@"s1:%lu: %@", s1.length, s1); // => s1:6: foo
NSLog(@"s2:%lu: %@ ", s2.length, s2); // => s2:6: bar
NSLog(@"s3:%lu: %@", s3.length, s3); // => s3:11: fbaro # "fbaro" is expected ---> No, correct behavior as NSString. See `exp4`.
}
+ (void)exp4
{
NSString *s1 = @"foo\0\0bar";
NSLog(@"s1:%lu: %@", s1.length, s1); // => s1:8: foo
// Oops! This is correct behavior... NSString can handle buffers containing NULL characters.
}
@end
int main (int argc, char** argv) {
@autoreleasepool {
[Exp exp1];
[Exp exp2];
[Exp exp3];
[Exp exp4];
}
return 0;
}
@s-shin
Copy link
Author

s-shin commented Oct 27, 2014

Environment:

  • OS X 10.9.4
  • XCode 6.1
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment