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

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

Создание объектов данных от необработанных байтов

Обычно Вы создаете объект данных из необработанных байтов с помощью CFDataCreate и CFDataCreateMutable функции для неизменных и непостоянных объектов данных соответственно. Эти функции делают копию байтов, которые Вы передаете как параметр. Когда объект данных выпущен, скопированные байты принадлежат по условию объект и освобождены. Это - Ваша ответственность освободить исходные байты.

Напротив, байты не копируются при создании использования объекта данных CFDataCreateWithBytesNoCopy с deallocator параметром, который не является kCFAllocatorNull. Вместо этого объект данных берет владение байтов, передал в как параметр и освобождает их, когда выпущен объект. Поэтому байты, которые Вы передаете этой функции, должно быть, были выделены с помощью средства выделения, которое Вы обеспечиваете как deallocator параметр.

Если Вы предпочитаете, чтобы байты не были скопированы или освобождены, когда объект выпущен, можно создать без копий, несвободное CFData объект с помощью CFDataCreateWithBytesNoCopy функция и передача kCFAllocatorNull как deallocator параметр, как в:

CFDataRef dictData = CFDataCreateWithBytesNoCopy(
                            NULL, bytes, length, kCFAllocatorNull);

Доступ и сравнение байтов

Основные три CFData функции CFDataGetBytesPtr, CFDataGetBytes, и CFDataGetLength. CFDataGetBytesPtr функционируйте возвращает указатель на байты, содержавшиеся в объекте данных. CFDataGetBytes функция помещает байты в предоставленный буфер. CFDataGetLength функционируйте возвращает число байтов, содержавшихся в объекте данных.

Например, следующий фрагмент кода инициализирует объект данных, myData, со строкой myString. Это тогда использует CFDataGetBytesPtr возвратить байты как указатель.

const UInt8 *myString = "Test string.";
CFDataRef myData =
        CFDataCreateWithBytesNoCopy(NULL, myString, strlen(myString), kCFAllocatorNull);
const UInt8 *ptr = CFDataGetBytePtr(myData);

Для создания объекта данных, содержащего подмножество байтов в другом объекте данных передайте значение для диапазона при вызове CFDataGetBytes функция. Например, следующий фрагмент кода инициализирует объект данных, data2, содержать поддиапазон data1:

unsigned char aBuffer[20];
const UInt8 *strPtr = "ABCDEFG";
CFDataRef data1 =
        CFDataCreateWithBytesNoCopy(NULL, strPtr, strlen(strPtr), kCFAllocatorNull);
CFDataGetBytes(data1, CFRangeMake(2, 4), aBuffer);
CFDataRef data2 = CFDataCreate(NULL, aBuffer, 20);

Чтобы определить, равны ли два объекта данных, используйте CFEqual функция, выполняющая сравнение байта для байта.

Копирование объектов данных

Объекты данных делают удобным преобразовать между эффективными, объектами данных только для чтения и непостоянными объектами данных. Вы используете CFDataCreateCopy и CFDataCreateMutableCopy функции для получения неизменной и непостоянной копии существующего объекта данных соответственно.