确定 UTF-8 编码的 NSData 是否包含以 null 结尾的字符串
Determine if UTF-8 encoded NSData contains a null-terminated string
我在 NSData
类别中进行了 NSData 到 NSString 的转换,因为我总是使用 NSString
方法:initWithData:encoding:
。但是,根据这个答案,,事情并没有那么简单。
到目前为止,我的 NSData
类别中有此方法,以努力与其他数据对象中的方法保持一致,return 来自同名方法的字符串:
- (NSString *) stringValue
{
return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
}
到目前为止它是成功的,但我想确定一个字符串是否以 null 结尾,以决定我是否应该改用此方法,同样来自答案 link:
NSString* str = [NSString stringWithUTF8String:[data bytes]];
如何确定 UTF-8 编码 NSData
是否包含以 null 结尾的字符串?
在得到下面的答案后,我为我的 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;
}
所以你想确定你的 NSData
的最后一个字节是否为空,你知道如何获得指向所有字节 (bytes
) 的指针以及有多少 (length
).
在 C 中,a "pointer to all the bytes" 可以用作数组并进行索引,因此您可以使用以下方法获取最后一个字节:
Byte *theBytes = data.bytes;
Byte lastByte = theBytes[bytes.length - 1];
如果您需要支持比完整缓冲区更短的空终止字符串,您将不得不扫描它,记住在最后停止(所以不要使用类似 strlen
的东西) .
在检查 null 时,您将获得指向字节和长度的指针,因为您可能想使用 initWithBytes:length:encoding:
来构造 NSString
而不是这两种方法中的任何一种在问题中。
HTH
空终止字面意思是最后一个字节的值为零。很容易检查:
char lastByte;
[myNSData getBytes:&lastByte range:NSMakeRange([myNSData length]-1, 1)];
if (lastByte == 0x0) {
// string is null terminated
} else {
// string is not null terminated
}
我在 NSData
类别中进行了 NSData 到 NSString 的转换,因为我总是使用 NSString
方法:initWithData:encoding:
。但是,根据这个答案,,事情并没有那么简单。
到目前为止,我的 NSData
类别中有此方法,以努力与其他数据对象中的方法保持一致,return 来自同名方法的字符串:
- (NSString *) stringValue
{
return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
}
到目前为止它是成功的,但我想确定一个字符串是否以 null 结尾,以决定我是否应该改用此方法,同样来自答案 link:
NSString* str = [NSString stringWithUTF8String:[data bytes]];
如何确定 UTF-8 编码 NSData
是否包含以 null 结尾的字符串?
在得到下面的答案后,我为我的 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;
}
所以你想确定你的 NSData
的最后一个字节是否为空,你知道如何获得指向所有字节 (bytes
) 的指针以及有多少 (length
).
在 C 中,a "pointer to all the bytes" 可以用作数组并进行索引,因此您可以使用以下方法获取最后一个字节:
Byte *theBytes = data.bytes;
Byte lastByte = theBytes[bytes.length - 1];
如果您需要支持比完整缓冲区更短的空终止字符串,您将不得不扫描它,记住在最后停止(所以不要使用类似 strlen
的东西) .
在检查 null 时,您将获得指向字节和长度的指针,因为您可能想使用 initWithBytes:length:encoding:
来构造 NSString
而不是这两种方法中的任何一种在问题中。
HTH
空终止字面意思是最后一个字节的值为零。很容易检查:
char lastByte;
[myNSData getBytes:&lastByte range:NSMakeRange([myNSData length]-1, 1)];
if (lastByte == 0x0) {
// string is null terminated
} else {
// string is not null terminated
}