【问题标题】:Iterate through NSData bytes遍历 NSData 字节
【发布时间】:2012-05-06 20:35:20
【问题描述】:

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

【问题讨论】:

    标签: objective-c cocoa-touch nsdata


    【解决方案1】:

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

    // 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]];
    }
    

    【讨论】:

    • doSomethingWithChar 行应该是什么,例如如果我想将字节的十六进制表示添加到 NSMutableString?
    • 如果 nsdata 实际上不是字符串怎么办?如果它包含 0x00 字节,那么您将无法遍历整个数据。
    【解决方案2】:

    更新!从 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]];
        }
    
    }];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      相关资源
      最近更新 更多