Работа с двоичными данными
Эта статья содержит примеры кода общих задач, применяющихся к неизменным и непостоянным объектам данных, 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
функции для получения неизменной и непостоянной копии существующего объекта данных соответственно.