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

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

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

Основные три CFMutableData функции CFDataGetMutableBytePtr, CFDataGetLength и CFDataSetLength. CFDataGetMutableBytePtr функционируйте возвращает указатель для записи в байты, содержавшиеся в непостоянном объекте данных. CFDataGetLength функционируйте возвращает число байтов, содержавшихся в объекте данных. CFDataSetLength функция позволяет Вам усекать или расширять длину непостоянного объекта данных. CFDataIncreaseLength функция также позволяет Вам изменять длину непостоянного объекта данных.

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

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

 // Create some strings.
const UInt8 *myString = "string for data1";
const UInt8 *yourString = "string for data2";
 
// Declare buffers used later.
const UInt8 *data1Bytes, *data2Bytes;
 
// Create mutable data objects, data1 and data2.
CFMutableDataRef data1 = CFDataCreateMutable(NULL, 0);
CFMutableDataRef data2 = CFDataCreateMutable(NULL, 0);
CFDataAppendBytes(data1, myString, strlen(myString));
CFDataAppendBytes(data2, yourString, strlen(yourString));
 
// Get and print the data1 bytes.
data1Bytes = CFDataGetBytePtr(data1);
fprintf(stdout, "data1 before: \"%s\"\n", data1Bytes);
 
// Get and print the data2 bytes.
data2Bytes = CFDataGetMutableBytePtr(data2);
fprintf(stdout, "data2 before: \"%s\"\n", data2Bytes);
 
// Copy the bytes from data1 into the mutable bytes from data2.
CFDataGetBytes(data1,
               CFRangeMake(0, CFDataGetLength(data1)),
               data2Bytes);
 
// Get and print the data2 bytes again.
fprintf(stdout, "data2 after: \"%s\"\n", CFDataGetBytePtr(data2));

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

data1 before: "string for data1"
data2 before: "string for data2"
data2 after: "string for data1"

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

CFDataAppendBytes функция позволяет Вам добавить байты указанной длины к непостоянному объекту данных. Например, Перечисление 2 копирует байты в data2 в aBuffer и затем добавляет aBuffer к data1:

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

 // Create mutable data objects, data1 and data2.
CFMutableDataRef data1 = CFDataCreateMutable(NULL, 0);
CFDataAppendBytes(data1, "ABCD", strlen("ABCD"));
CFMutableDataRef data2 = CFDataCreateMutable(NULL, 0);
CFDataAppendBytes(data2, "EFGH", strlen("EFGH"));
 
// Get the data2 bytes.
const UInt8 *aBuffer = CFDataGetBytePtr(data2);
 
// Append the bytes from data2 to data1.
CFDataAppendBytes(data1, aBuffer, CFDataGetLength(data2));

Замена байтов

Можно удалить диапазон байтов в непостоянном объекте данных (использующий CFDataDeleteBytes функция) или замена диапазон байтов с другими байтами (использующий CFDataReplaceBytes функция).

В Перечислении 3, диапазоне байтов в data1 заменяется байтами в data2 использование CFDataReplaceBytes (содержание data1 изменения от “Лиз и Джона” “Лиз и Ларри”):

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

// Create mutable data objects, data1 and data2.
CFMutableDataRef data1 = CFDataCreateMutable(NULL, 0);
CFDataAppendBytes(data1, "Liz and John", strlen("Liz and John"));
CFMutableDataRef data2 = CFDataCreateMutable(NULL, 0);
CFDataAppendBytes(data2, "Larry", strlen("Larry"));
 
// Allocate a buffer the length of data2.
unsigned len = CFDataGetLength(data2);
unsigned char *aBuffer = malloc(len);
 
// Put the data2 bytes into the buffer.
CFDataGetBytes(data2, CFRangeMake(0, len), aBuffer);
 
// Replace John with Larry.
CFDataReplaceBytes(data1, CFRangeMake(8, CFDataGetLength(data1) - 8), aBuffer, len);