Процедуры преобразования библиотеки XDR
Процедуры преобразования библиотеки XDR перечислены в табл. 20.2. Эти процедуры позволяют выполнять и прямое, и обратное преобразование данных, поскольку в них большинство параметров являются указателями на объекты данных, а не значениями этих данных.
Таблица 20.2. Процедуры преобразования данных XDR, входящие в состав библиотеки XDR
| Процедура | Параметры | Преобразуемый тип данных |
| xdr__bool | xdrs, ptrbool | Логическое значение (значение int в языке С) |
| / xdr_bytes | xdrs, ptrstr, strsize, maxsize | Строка байтов переменной длины |
| xdr_char | xdrs, ptrchar | Символ |
| xdrjiouble | xdrs, ptrdouble | Число с плавающей точкой двойной точности |
| xdr_enum | xdrs, ptrint | Переменная перечислимого типа (значение int в языке С) |
| xdr_float | xdrs, ptrfloat | Число с плавающей точкой одинарной точности |
| xdr_int | xdrs, ip | 32-битовое целое число |
| xdr_long | xdrs, ptrlong | 64-битовое целое число |
| xdr_opaque | xdrs, ptrchar, count | Байты, передаваемые без преобразования |
| xdrjpointer | xdrs, ptrobj, objsize, xdrobj | Указатель (используемый в связанных структурах данных, таких как списки или деревья) |
| xdr_short | xdrs, ptrshort | 16-битовое целое число |
| xdr_string | xdrs, ptrstr, maxsize | Строка языка С |
| xdr_u_char | xdrs, ptruchar | 8-битовое целое число без знака |
| xdrji short | xdrs, ptrushort | 16-битовое целое число без знака |
Для формирования сообщения необходимо вызвать в приложении процедуры преобразования XDR для каждого элемента данных в сообщении. После кодирования каждого элемента данных и размещения их в потоке XDR приложение может передать сообщение путем отправки результирующего потока. В приложении-получателе весь этот процесс должен быть выполнен в обратном порядке. В нем вызывается процедура xdrmem_create для создания в памяти буфера, предназначенного для размещения потока XDR, и в этот буфер записывается входящее сообщение. Программное обеспечение XDR регистрирует направление преобразования в самом потоке, в котором процедуры преобразования могут получить доступ к этому потоку. При создании потока XDR, который будет использоваться для ввода, получатель задает в качестве третьего параметра функции xdrmem_create константу XDRJDEC0DE. В результате при вызове получателем каждой отдельной процедуры преобразования с указанием в качестве параметра входного потока процедура извлекает из потока элемент данных и преобразует его во внутреннее представление. Здорово. Высококлассные счетчики воды оптом вам обязательно понравятся. Например, если получатель установил поток XDR, используемый для ввода (т.е. в вызове процедуры инициализации был указан параметр XDR_DEC0DE), он может извлечь из потока 32-битовое целое число и преобразовать его во внутреннее представление путем вызова процедуры xdr_int:
int i; /* Целое число во внутреннем представлении */ ... /* Предполагается, что поток инициализируется для */ /* работы в режиме XDR_DEC0DE */ xdr_int(xdrs, &i); /* Целое число извлекается из потока */
Поэтому, в отличие от процедур преобразования htons и ntohs, предусмотренных в операционной системе Linux, отдельные процедуры преобразования XDR не позволяют определить его направление. Вместо этого они требуют, чтобы это направление было задано в программе при создании потока XDR.
Отдельные процедуры преобразования XDR не позволяют указать направление преобразования. Вместо этого отдельная процедура, позволяющая выполнять и прямое и обратное преобразование, устанавливает направление преобразования путем определения характеристик используемого потока XDR.