10

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

4

2 回答 2

32

与其将字节附加到可变字符串,不如使用数据创建一个字符串:

// 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]];
}
于 2012-05-06T20:36:52.943 回答
13

更新!从 iOS 7 开始,有一种新的首选方法可以遍历 NSData 对象中的所有字节。

因为NSData现在可以在底层由多个不相交的字节数组块组成,所以调用[NSData bytes]有时会导致内存效率低下,因为它需要将所有底层块扁平化为调用者的单个字节数组。

为避免这种行为,最好使用enumerateByteRangesUsingBlock: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]];
    }

}];
于 2014-11-20T22:14:24.207 回答