2010-01-21 21 views
4

在PHP中,我可以打電話base64_encode("\x00". $username. "\x00". $password)"\x00"表示NULL字符。如何在NSString中使用NULL字符?

現在,在Objective-C,我有一個轉換的NSData由DaveDribin創建base64 encoded NSString的功能。

如何從具有NULL字符的字符串創建數據?

這似乎並沒有工作...

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

請描述「不起作用」 – slf 2010-01-21 19:01:03

+0

NSLog你的字符串 – vaddieg 2010-01-21 19:14:07

+0

爲什麼你的字符串包含NUL字符?這聽起來像是應該是一個NSData開始的東西。 – Chuck 2010-01-21 22:06:48

回答

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 string]; 
[string initWithBytes:bytes length:sizeof(bytes)]; 
NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding]; 

你可以在開始看空字節,在用戶名/密碼之間在最後 - 因爲char[]是空終止。

+0

您正在初始化字符串兩次(使用'[NSString string]'和'initWithBytes:length:')。另外,您可能需要使用'initWithBytes:length:encoding:'來實際構建。 – 2017-11-19 01:53:00

0

不明白爲什麼這個工程,但而不是使用@「%C」作爲格式字符串「\ 0」,嘗試使用@ 「%@」 作爲格式字符串@ 「\ 0」

1

你的語法是正確的。 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

stefanB's answer看起來像一個正確的選擇。原來我傳遞錯誤的信息,以使它看起來像\ 0是不工作

這是確定的:

[NSString stringWithFormat:@"\0user\0pass"] 
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]; 
相關問題