确定UTF-8编码的NSData是否包含以null结尾的字符串

She*_*mus 3 objective-c character-encoding nsstring nsdata ios

我在NSData类别中有NSData-to-NSString转换,因为我总是使用NSString方法:initWithData:encoding:.但是,根据这个答案,/sf/answers/172749951/,并不是那么简单.

到目前为止,我在我的NSData类别中使用了此方法,以便与其他数据对象中的方法保持一致,这些方法从具有相同名称的方法返回字符串:

- (NSString *) stringValue
{
    return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
}
Run Code Online (Sandbox Code Playgroud)

到目前为止它是成功的,但我想确定一个字符串是否以null结尾,以决定是否应该使用此方法,也来自答案链接:

NSString* str = [NSString stringWithUTF8String:[data bytes]];
Run Code Online (Sandbox Code Playgroud)

如何确定UTF-8编码是否NSData包含以空值终止的字符串?


得到下面的答案后,我为我的NSDataCategory方法编写了更全面的实现,stringValue:

- (NSString *) stringValue
{
    //Determine if string is null-terminated
    char lastByte;
    [self getBytes:&lastByte range:NSMakeRange([self length]-1, 1)];

    NSString *str;

    if (lastByte == 0x0) {
        //string is null-terminated
        str = [NSString stringWithUTF8String:[self bytes]];
    } else {
        //string is not null-terminated
        str = [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
    }

    return str;
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ton 7

空终止字面意思是最后一个字节的值为零.这很容易检查:

char lastByte;
[myNSData getBytes:&lastByte range:NSMakeRange([myNSData length]-1, 1)];
if (lastByte == 0x0) {
    // string is null terminated
} else {
    // string is not null terminated
}
Run Code Online (Sandbox Code Playgroud)