Работа с непостоянными двоичными данными
Эта статья содержит примеры кода общих задач, применяющихся в частности к непостоянным объектам данных, 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); |