Свопинг байта

Если необходимо узнать порядок байтов узла, можно использовать функцию CFByteOrderGetCurrent. Возможные возвращаемые значения CFByteOrderUnknown, CFByteOrderLittleEndian, и CFByteOrderBigEndian.

Целые числа свопинга байта

Базовая Основа обеспечивает три оптимизированных примитивных функции для свопинга байта — CFSwapInt16, CFSwapInt32, и CFSwapInt64. Все другие функции свопинга используют эти примитивы для выполнения их работы. В целом Вы не должны будете использовать эти примитивы непосредственно.

Несмотря на то, что примитивная подкачка функций свопинга безусловно, высокоуровневые функции свопинга определяются таким способом, которым они ничего не делают, когда подкачка байта не требуется — другими словами, когда источник и заказы байта узла являются тем же. Для целых типов эти функции принимают формы CFSwapXXXBigToHost и CFSwapXXXLittleToHost, CFSwapXXXHostToBig, и CFSwapXXXHostToLittle где XXX тип данных такой как Int32. Например, если бы Вы были на машине с прямым порядком байтов, читая 16-разрядное целочисленное значение из сети, данные которой находятся в сетевом порядке байтов (обратный порядок байтов), то Вы использовали бы функцию CFSwapInt16BigToHost. Перечисление 1 демонстрирует этот процесс.

Перечисление 1  , Подкачивающее Целое число на 16 битов

SInt16  bigEndian16;
SInt16  swapped16;
 
// Swap a 16 bit value read from network.
swapped16 = CFSwapInt16BigToHost(bigEndian16);

Раздел Byte Ordering представил пример простой структуры C, созданной и сохраненной на диск на небольшой машине порядка байтов и затем чтении от диска на машине с обратным порядком байтов. Для исправления ситуации необходимо подкачать байты в каждом поле. Код в Перечислении 2 демонстрирует, как Вы использовали бы Базовые функции свопинга байта Основы для выполнения этого.

Перечисление  полей свопинга 2 байтов в структуре C

// Byte swap the values if necessary.
aStruct.int1 = CFSwapInt32LittleToHost(aStruct.int1)
aStruct.int2 = CFSwapInt32LittleToHost(aStruct.int2)

Принимая архитектуру с обратным порядком байтов, функции, используемые в Перечислении 2, подкачали бы байты в каждом поле. Рисунок 1 показывает эффект свопинга байта на поле aStruct.int1. Обратите внимание на то, что подкачивающий байт код ничего не сделал бы, когда работается машина с прямым порядком байтов. Компилятор должен оптимизировать код и оставить данные нетронутыми.

  Прямой порядок байтов Четырех байтов рисунка 1 к подкачке с обратным порядком байтов
Four-byte little-endian to big-endian swap

Байт, подкачивающий значения с плавающей точкой

Даже на единой платформе может быть много различных представлений для значений с плавающей точкой. Если Вы не очень осторожны, пытание передать значения с плавающей точкой через границы платформы не вызывает конца головных болей. Чтобы помочь Вам работать с числами с плавающей точкой, Базовая Основа определяет ряд функций и двух специальных типов данных в дополнение к подкачивающим целое число функциям. Эти функции позволяют Вам кодировать 32 - и 64-разрядные значения с плавающей точкой таким способом, которым они могут позже декодироваться, и байт подкачивается при необходимости. Перечисление 3 показывает Вам, как закодировать 64-разрядное число с плавающей точкой, и Перечисление 4 показывает, как декодировать его.

Перечисление 3  , кодирующее значение с плавающей точкой

Float64             myFloat64;
CFSwappedFloat64    swappedFloat;
 
// Encode the floating-point value.
swappedFloat = CFConvertFloat64HostToSwapped(myFloat64);

Перечисление 4  , Декодирующее значение с плавающей точкой

Float64             myFloat64;
CFSwappedFloat64    swappedFloat;
 
// Decode the floating-point value.
myFloat64 = CFConvertFloat64SwappedToHost(swappedFloat);

Типы данных CFSwappedFloat32 и CFSwappedFloat64 содержите значения с плавающей точкой в каноническом представлении. CFSwappedFloat не является самостоятельно плаванием и не должен непосредственно использоваться в качестве один. Можно, однако, отправить тот в другой процесс, сохранить его на диск или отправить его по сети. Поскольку формат преобразовывается в и от стандартного формата функциями преобразования, нет никакой потребности в явном свопинге API. Свопинг байта заботится о для Вас во время преобразования формата при необходимости.