迭代NSData字节

时间:2012-05-06 20:35:20

标签: objective-c cocoa-touch nsdata

如何逐个遍历[NSData bytes]并将其附加到NSMutableString或使用NSLog()进行打印?

2 个答案:

答案 0 :(得分:29)

不是将字节附加到可变字符串,而是使用数据创建字符串:

// Be sure to use the right encoding:
NSString *result = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

如果确实想要遍历字节:

NSMutableString *result = [NSMutableString string];
const char *bytes = [myData bytes];
for (int i = 0; i < [myData length]; i++)
{
    [result appendFormat:@"%02hhx", (unsigned char)bytes[i]];
}

答案 1 :(得分:11)

更新!从iOS 7开始,有一种新的,首选的方法来迭代NSData对象中的所有字节。

因为NSData现在可以由多个不相交的字节数组块组成,所以调用[NSData bytes]有时可能是内存效率低的,因为它需要将所有底层块拼合成一个调用者的字节数组。

为了避免这种行为,最好使用NSData的enumerateByteRangesUsingBlock:方法枚举字节,这将返回现有底层块的范围,您可以直接访问它们而无需生成任何新的数组结构。当然,你需要注意不要在提供的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]];
    }

}];