Работа с непостоянными двоичными данными

Эта статья содержит примеры кода общих задач, применяющихся в частности к непостоянным объектам данных, NSMutableData объекты. В основном можно изменить байты в непостоянном объекте двоичных данных, заставив массив байтов изменить непосредственно, добавив байты им или заменив диапазон байтов.

Изменение байтов

Два NSMutableData примитивные методы —mutableBytes и setLength:— обеспечьте основание для всех других методов в классе. mutableBytes метод возвращает указатель для записи в байты, содержавшиеся в непостоянном объекте данных. setLength: метод позволяет Вам усекать или расширять длину непостоянного объекта данных. increaseLengthBy: метод также позволяет Вам изменять длину непостоянного объекта данных.

В перечислении 1, mutableBytes используется для возврата указателя на байты в data2. Байты в data2 тогда перезаписываются с содержанием data1.

Перечисление 1  , Изменяющее байты

NSMutableData *data1, *data2;
NSString *myString = @"string for data1";
NSString *yourString = @"string for data2";
const char *utfMyString = [myString UTF8String];
const char *utfYourString = [yourString UTF8String];
unsigned char *firstBuffer, secondBuffer[20];
 
/* initialize data1, data2, and secondBuffer... */
data1 = [NSMutableData dataWithBytes:utfMyString length:strlen(utfMyString)+1];
data2 = [NSMutableData dataWithBytes:utfYourString length:strlen(utfYourString)+1];
 
[data2 getBytes:secondBuffer length:20];
NSLog(@"data2 before: \"%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 after: \"%s\"\n", (char *)secondBuffer);

Это - вывод от Перечисления 1:

Oct  3 15:59:51 [1113] data2 before: "string for data2"
Oct  3 15:59:51 [1113] data1: "string for data1"
Oct  3 15:59:51 [1113] data2 after: "string for data1"

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

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

Перечисление 2  , Добавляющее байты

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: метод. В Перечислении 3, диапазоне байтов в data1 заменяется байтами в data2, и содержание data1 изменения от “Лиз и Джона” “Лиз и Ларри”:

Перечисление 3  , Заменяющее байты

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