yan*_*nis 9 cocoa-touch objective-c nsdata
我如何[NSData bytes]逐个迭代并将它们附加到NSMutableString或使用NSLog()?
dre*_*lax 30
不是将字节附加到可变字符串,而是使用数据创建字符串:
// Be sure to use the right encoding:
NSString *result = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)
如果你真的想循环遍历字节:
NSMutableString *result = [NSMutableString string];
const char *bytes = [myData bytes];
for (int i = 0; i < [myData length]; i++)
{
[result appendFormat:@"%02hhx", (unsigned char)bytes[i]];
}
Run Code Online (Sandbox Code Playgroud)
Jas*_*run 12
更新!从iOS 7开始,有一种新的,首选的方法来遍历NSData对象中的所有字节.
因为NSData现在可以由多个不相交的字节数组块组成,所以调用[NSData bytes]有时可能是内存效率低的,因为它需要将所有底层块展平为调用者的单个字节数组.
为了避免这种行为,最好使用enumerateByteRangesUsingBlock:NSData 的方法枚举字节,NSData将返回现有底层块的范围,您可以直接访问它们而无需生成任何新的数组结构.当然,你需要注意不要在提供的C风格的数组中不恰当地戳.
NSMutableString* resultAsHexBytes = [NSMutableString string];
[data enumerateByteRangesUsingBlock:^(const void *bytes,
NSRange byteRange,
BOOL *stop) {
//To print raw byte values as hex
for (NSUInteger i = 0; i < byteRange.length; ++i) {
[resultAsHexBytes appendFormat:@"%02x", ((uint8_t*)bytes)[i]];
}
}];
Run Code Online (Sandbox Code Playgroud)