如何在NSString中使用NULL字符?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在NSString中使用NULL字符?相关的知识,希望对你有一定的参考价值。

php中,我可以调用base64_encode("x00". $username. "x00". $password)"x00"表示NULL字符。

现在,在Objective-C中,我有一个函数将NSData转换为由DaveDribin创建的base64 encoded NSString

如何从具有NULL字符的字符串创建数据?

这似乎不起作用......

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

像这样:

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

您可以在开头,在用户名/密码和结尾之间看到空字节 - 因为char[]为空终止。

另一答案

你的语法是正确的。 NSString只是不能很好地处理NULL字节。我找不到任何关于它的文档,但是NSString将默默地忽略%c格式说明符,其参数为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:@"--"];
    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字符串)。

另一答案

不太清楚为什么会这样,但不是使用@“%c”作为' 0'的格式字符串,尝试使用@“%@”作为格式字符串@“ 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];
另一答案

stefanB's answer看起来是一个正确的选择。事实证明我传递了错误的信息使它看起来像 0无法正常工作

这没关系:

[NSString stringWithFormat:@"userpass"]

以上是关于如何在NSString中使用NULL字符?的主要内容,如果未能解决你的问题,请参考以下文章

NSURL为null,而在Objective-C中NSString是正确的

如何重构这个 Java 代码片段

HTTP转换为null什么意思?

getActivity() 在片段上返回 null?

将UTF-8编码的NSData转换为NSString

如何在 iOS react-native-config 和 AsyncStorage 中修复 NSNull 类型的 JSON 值“<null>”无法转换为 NSString?