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

时间:2015-01-14 02:44:29

标签: ios objective-c character-encoding nsstring nsdata

我在NSData类别中进行了NSData-to-NSString转换,因为我始终使用NSString方法:initWithData:encoding:。但是,根据这个答案,https://stackoverflow.com/a/2467856/1231948,并不是那么简单。

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

- (NSString *) stringValue
{
    return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
}

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

NSString* str = [NSString stringWithUTF8String:[data bytes]];

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


在得到以下答案后,我为NSData类别方法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;
}

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

因此,您希望确定NSData的最后一个字节是否为空,您知道如何获取指向所有字节(bytes)的指针以及有多少({{1} }})。

在C a"指向所有字节的指针"可以用作数组并编制索引,因此您可以使用以下命令获取最后一个字节:

length

如果您需要支持以空值终止的字符串更短,那么您需要扫描完整的缓冲区,记住最后停止(因此不要使用{{1}之类的内容})。

在检查null时,您将获得指向字节和长度的指针,因为您可能希望使用Byte *theBytes = data.bytes; Byte lastByte = theBytes[bytes.length - 1]; 来构造strlen而不是两个方法中的任何一个。问题

HTH