2012-05-06 34 views
7

Làm cách nào để tôi có thể lặp qua [NSData bytes] từng cái một và nối chúng vào một NSMutableString hoặc in chúng bằng cách sử dụng NSLog()?Lặp lại qua các byte NSData

Trả lời

28

Thay vì phụ byte thành một chuỗi có thể thay đổi, tạo ra một chuỗi bằng cách sử dụng dữ liệu:

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

Nếu bạn thực sự muốn lặp qua các byte:

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

Dòng doSomethingWithChar nên như thế nào. Ví dụ: nếu tôi muốn thêm biểu diễn thập lục phân của byte vào NSMutableString? – yannis

+0

nếu nsdata không thực sự là một chuỗi thì sao? nếu nó chứa 0x00 byte thì bạn sẽ không thể lặp qua toàn bộ dữ liệu. –

11

cập nhật! Kể từ iOS 7, có một cách mới, được ưu tiên để lặp qua tất cả các byte trong một đối tượng NSData.

Bởi vì NSData có thể bao gồm nhiều mảng mảng tách rời dưới mui xe, gọi số [NSData bytes] đôi khi có thể không hiệu quả bộ nhớ, vì nó cần làm phẳng tất cả các khối cơ bản thành một mảng byte cho người gọi. Để tránh hành vi này, tốt hơn nên liệt kê các byte bằng cách sử dụng phương thức NSData enumerateByteRangesUsingBlock:, nó sẽ trả về phạm vi của các khối cơ bản hiện có mà bạn có thể truy cập trực tiếp mà không cần tạo bất kỳ cấu trúc mảng mới nào. Tất nhiên, bạn sẽ cần phải cẩn thận không để poking xung quanh không thích hợp trong mảng C-style được cung cấp.

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

}]; 
Các vấn đề liên quan