我在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;
}
答案 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