在PHP中,我可以调用base64_encode("\x00". $username. "\x00". $password)
,"\x00"
表示NULL字符。
现在,在Objective-C中,我有一个将NSData转换为DaveDribin创建的base64 encoded NSString的函数。
如何从包含NULL字符的字符串创建数据?
这似乎不起作用......
NSData * authCode = [[NSString stringWithFormat:@"%c%@%c%@", '\0', self.username, '\0', self.password] dataUsingEncoding:NSUTF8StringEncoding];
答案 0 :(得分:4)
像这样:
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 :(得分:1)
您的语法是正确的。 NSString只是不能很好地处理NULL
个字节。我找不到任何关于它的文档,但是NSString将默默地忽略%c
格式说明符,其参数为0
(并且在该注释中,字符常量'\0'
扩展为整数{ {1}};这是正确的)。但是,它可以处理直接嵌入到NSString文字中的0
。
请参阅此代码:
\0
返回:
#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
个字节,因此它会提前终止NSLog字符串。
答案 2 :(得分:0)
不太确定为什么会这样,但不要使用@“%c”作为带有'\ 0'的格式字符串,请尝试使用@“%@”作为格式字符串@“\ 0”
答案 3 :(得分:0)
stefanB's answer看起来是一个正确的选择。事实证明我传递了错误信息,使其看起来像\ 0无法正常工作
这没关系:
[NSString stringWithFormat:@"\0user\0pass"]
答案 4 :(得分:0)
你也可以尝试这个(测试和工作 - 取自: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];