Работа с NSMutableData

Модификация байт

Класс NSMutableData предоставляет два примитивных метода mutableBytes и setLength:, представляющих основу для всех остальных методов класса. Следующий пример показывает заполнение data2 содержимым data1.

NSMutableData *data1, *data2;
NSString *myString = @"строка для data1";
NSString *yourString = @"строка для data2";
const char *utfMyString = [myString UTF8String];
const char *utfYourString = [yourString UTF8String];
unsigned char *firstBuffer, secondBuffer[40];
 
/* инициализация data1, data2, и secondBuffer... */
data1 = [NSMutableData dataWithBytes:utfMyString length:strlen(utfMyString)+1];
data2 = [NSMutableData dataWithBytes:utfYourString length:strlen(utfYourString)+1];
 
[data2 getBytes:secondBuffer length:40];
NSLog(@"data2 до: \"%s\"\n", (char *)secondBuffer);
 
firstBuffer = [data2 mutableBytes];
[data1 getBytes:firstBuffer length:[data2 length]];
NSLog(@"data1: \"%s\"\n", (char *)firstBuffer);
 
[data2 getBytes:secondBuffer length:20];
NSLog(@"data2 после: \"%s\"\n", (char *)secondBuffer);

Вывод после работы вышеприведенного листинга:

Dec  12 13:49:18 [1113] data2 до: "строка для data2"
Dec  12 13:49:18 [1113] data1: "строка для data1"
Dec  12 13:49:18 [1113] data2 после: "строка для data1"

Добавление байт

Методы appendBytes:length: и appendData: добавляют байты из другого объекта данных или изменяемого объекта данных. В следующем примере данные data2 копируются в aBuffer, а затем из aBuffer добавляется к data1.

NSMutableData *data1, *data2;
NSString *firstString  = @"ABCD";
NSString *secondString = @"EFGH";
const char *utfFirstString = [firstString UTF8String];
const char *utfSecondString = [secondString UTF8String];
unsigned char *aBuffer;
unsigned len;
 
data1 = [NSMutableData dataWithBytes:utfFirstString length:strlen(utfFirstString)];
data2 = [NSMutableData dataWithBytes:utfSecondString length:strlen(utfSecondString)];
 
len = [data2 length];
aBuffer = malloc(len);
 
[data2 getBytes:aBuffer length:[data2 length]];
[data1 appendBytes:aBuffer length:len];

В результате data1 содержит ASCII символы "ABCDEFGH".

Замена байт

Если необходимо очистить (заполнить нулями) контент изменяемого объекта данных, можно использовать метод resetBytesInRange:, если надо заменить другими байтами, то используется метод replaceBytesInRange:withBytes:. В следующем примере диапазон байт в data1 заменяется байтами из data2, изменяя "Liz and John" на "Liz and Larry".

NSMutableData *data1, *data2;
NSString *myString = @"Liz and John";
NSString *yourString = @"Larry";
const char *utfMyString = [myString UTF8String];
const char *utfYourString = [yourString UTF8String];
unsigned len;
unsigned char *aBuffer;
NSRange range = {8, strlen(utfYourString)};
 
data1 = [NSMutableData dataWithBytes:utfMyString length:strlen(utfMyString)];
data2 = [NSMutableData dataWithBytes:utfYourString length:strlen(utfYourString)];
 
len = [data2 length];
aBuffer = malloc(len);
[data2 getBytes:aBuffer length:len];
[data1 replaceBytesInRange:range withBytes:aBuffer];
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac