Determine if UTF-8 encoded NSData contains a null-terminated string

痞子三分冷 提交于 2020-01-24 10:48:33

问题


I have the NSData-to-NSString conversion in an NSData Category, because I'm always using the NSString method: initWithData:encoding:. But, according to this answer, https://stackoverflow.com/a/2467856/1231948, it is not that simple.

So far, I have this method in my NSData Category, in an effort to keep consistent with methods in other data objects that return a string from a method with the same name:

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

So far it is successful, but I would like to determine if a string is null-terminated, to decide whether I should use this method instead, also from the answer link:

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

How do I determine if UTF-8 encoded NSData contains a null-terminated string?


After getting the answer below, I wrote more thorough implementation for my NSData Category method, 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;
}

回答1:


Null termination literally means that the last byte has a value of zero. It's easy to check for:

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



回答2:


So you wish to determine whether the last byte of your NSData is a null, you know how to get a pointer to all the bytes (bytes) and how many there are (length).

In C a "pointer to all the bytes" can be used as an array and indexed, so you can get the last byte using:

Byte *theBytes = data.bytes;
Byte lastByte = theBytes[bytes.length - 1];

If you need to support the null-terminated string being shorter then the full buffer you'll have to scan for it, remembering to stop at the end (so don't use something like strlen).

In checking for the null you will get both a pointer to the bytes and the length, given that you might want to use initWithBytes:length:encoding: to construct the NSString rather than either of the two methods in the question.

HTH



来源:https://stackoverflow.com/questions/27935054/determine-if-utf-8-encoded-nsdata-contains-a-null-terminated-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!