XDR
(
англ.
External Data Representation - внешнее представление данных
) — международный стандарт передачи данных в
Интернете
, используемый в различных
RFC
для описания типов. XDR позволяет организовать не зависящую от платформы передачу данных между компьютерами в гетерогенных сетях.
External Data Representation (XDR) — это стандарт
IETF
с 1995 года. Он позволяет данным быть упакованными не зависящим от архитектуры способом, таким образом, данные могут передаваться между гетерогенными компьютерными системами.
-
Преобразование из локального представления в XDR называется кодированием.
-
Преобразование из XDR в локальное представление называется декодированием.
-
XDR выполнен как портативная (переносная) библиотека функций между различными операционными системами и так же не зависит от транспортного уровня.
Среди использующих XDR программ можно назвать следующие:
Типы данных в XDR
Мотивация использования XDR
Разные компьютеры могут иметь разное внутреннее представление информации.
Например, 32-битный Integer имеет 2 возможные формы представления:
-
Порядок байтов от старшего к младшему (Motorola 68000)
-
Прямой порядок байтов (Intel 80x86)
Для некоторых функций WinSock их аргументы (то есть, параметры функций) должны храниться в обратном порядке.
-
Сервер и клиент могут обмениваться разными типами данных.
-
Если сервер и клиент выполняются на двух соответствующих машинах, используя разное внутреннее представление данных, то они должны согласовывать точно представление всех данных, передаваемых между ними.
-
Sun Microsystems разработала external data representation (XDR), который определяет представление для различных типов данных (integer, enumeration….)
-
XDR стал стандартом де-факто для большинства клиент-серверных приложений:
— Программа преобразует сообщения из своего внутреннего представления в XDR для последующей передачи. Это называется кодированием.
— Получатель преобразует полученное сообщение из XDR в собственное представление. Это называется декодированием.
Типы данных в XDR
XDR указывает представление для большинства типов данных в
C
:
Закодированная информация содержит только данные, она не содержит информации о типе данных. Например, после кодирования 32-битного integer результатом будет 32-битный integer в XDR. Не будет информации о том, что это integer. Клиенты и серверы, использующие XDR, должны согласовывать тип данных сообщений, которыми они обмениваются.
Программная поддержка использования XDR
-
XDR определяет представление для каждого типа данных.
-
Например, 32-битный integer имеет порядок байтов от старшего к младшему.
-
Для содействия программистам XDR обеспечивает библиотеку стандартных программ для конвертирования представления данных.
Посылка сообщения в XDR
-
Посылаемое сообщение может состоять из нескольких пунктов данных (items).
-
Например, сообщение содержит информацию о студенте. Оно состоит из трёх пунктов:
— имя (строка символов)
-ID (целое)
-совокупный GPA (floating-point number)
-
Перед посылкой сообщения программа (клиент или сервер) конвертирует всю информацию пунктов из внутреннего представления в XDR.
-
Шаги конвертирования
-
Предоставление буфера для хранения всей информации сообщения, которая должна быть послана.
-
Вызов xdrmem_create() для инициализации потока XDR.
Например: xdrmem_create() возвращает указатель на пустой поток.
-
-
Вызов стандартной программы в XDR для преобразования каждого пункта информации. Она будет дописывать закодированную информацию в конец потока следующим образом:
*#* помещать закодированную информацию в следующее доступное место в буфере
*#* обновлять внутренний указатель на поток, помещая его на новое доступное свободное место
-
-
-
Например, конвертирование 32-битного целого:
-
-
После кодирования всех пунктов сообщения это сообщение посылается.
Стандартные программы преобразования в XDR
Получение сообщения в XDR
-
Когда программа получает сообщение в XDR, она конвертирует каждый пункт данных в сообщении из XDR в своё внутреннее представление.
-
Шаги:
-
Вызов xdrmem_create() для инициализации потока XDR , указав XDR_DECODE, как четвёртый аргумент.
-
Помещение полученного сообщения в буфер.
-
Вызов подходящей стандартной программы преобразования для декодирования каждого пункта данных полученного сообщения.
Например, декодирование 32-битного целого:
Ссылки