External Data Representation

XDR ( англ. External Data Representation - зовнішнє подання даних ) - Міжнародний стандарт передачі даних в Інтернеті, що використовується в різних RFC для опису типів. XDR дозволяє організувати не залежну від платформи передачу даних між комп'ютерами в гетерогенних мережах.

External Data Representation (XDR) - це стандарт IETF з 1995 року. Він дозволяє даними бути упакованими не залежних від архітектури способом, таким чином, дані можуть передаватися між гетерогенними комп'ютерними системами.

  • Перетворення з локального представлення в XDR називається кодуванням.
  • Перетворення з XDR в локальне уявлення називається декодуванням.
  • XDR виконаний як портативна (переносна) Бібліотека функцій між різними операційними системами і так само не залежить від транспортного рівня.

Серед використовують XDR програм можна назвати наступні:


1. Типи даних в XDR

  • boolean
  • int (32-бітове ціле число)
  • hyper (64-бітове ціле число)
  • float
  • double
  • enumeration
  • structure
  • string
  • масиви фіксованої довжини
  • масиви змінної довжини
  • неформатований ("сирі") дані

2. Мотивація використання XDR

Різні комп'ютери можуть мати різне внутрішнє подання інформації. Наприклад, 32-бітний Integer має 2 можливих форми подання:

  • Порядок байтів від старшого до молодшого (Motorola 68000)
  • Прямий порядок байтів (Intel 80x86)


Для деяких функцій WinSock їх аргументи (тобто, параметри функцій) повинні зберігатися в зворотному порядку.

  • Сервер і клієнт можуть обмінюватись різними типами даних.
  • Якщо сервер і клієнт виконуються на двох відповідних машинах, використовуючи різний внутрішнє подання даних, то вони повинні узгоджувати точно представлення всіх даних, переданих між ними.
  • Sun Microsystems розробила external data representation (XDR), який визначає представлення для різних типів даних (integer, enumeration ....)
  • XDR став стандартом де-факто для більшості клієнт-серверних додатків:

- Програма перетворює повідомлення зі свого внутрішнього представлення в XDR для подальшої передачі. Це називається кодуванням. - Одержувач перетворює отримане повідомлення з XDR у власне уявлення. Це називається декодуванням.


3. Типи даних в XDR

XDR вказує уявлення для більшості типів даних в C :


Закодована інформація містить лише дані, вона не містить інформації про тип даних. Наприклад, після кодування 32-бітного integer результатом буде 32-бітний integer в XDR. Не буде інформації про те, що це integer. Клієнти і сервери, що використовують XDR, повинні погоджувати тип даних повідомлень, якими вони обмінюються.

4. Програмна підтримка використання XDR

  • XDR визначає уявлення для кожного типу даних.
  • Наприклад, 32-бітний integer має порядок байтів від старшого до молодшого.
  • Для сприяння програмістам XDR забезпечує бібліотеку стандартних програм для конвертації представлення даних.

5. Посилка повідомлення в XDR

  • Посилається повідомлення може складатися з декількох пунктів даних (items).
  • Наприклад, повідомлення містить інформацію про студента. Воно складається з трьох пунктів:

- Ім'я (рядок символів)-ID (ціле)-сукупний GPA (floating-point number)

  • Перед посилкою повідомлення програма (клієнт або сервер) конвертує всю інформацію пунктів з внутрішнього подання в XDR.
  • Кроки конвертації
    1. Надання буфера для зберігання всієї інформації повідомлення, яка повинна бути надіслана.
    2. Виклик xdrmem_create () для ініціалізації потоку XDR.

Наприклад: xdrmem_create () повертає покажчик на порожній потік.

    1. Виклик стандартної програми в XDR для перетворення кожного пункту інформації. Вона буде дописувати закодовану інформацію в кінець потоку наступним чином:
 * # * Поміщати закодовану інформацію в наступне доступне місце в буфері * # * оновлювати внутрішній покажчик на потік, поміщаючи його на нове доступне вільне місце 
      • Наприклад, конвертація 32-бітного цілого:


    1. Після кодування всіх пунктів повідомлення це повідомлення надсилається.

6. Стандартні програми перетворення в XDR

7. Отримання повідомлення в XDR

  • Коли програма виходить повідомлення в XDR, вона конвертує кожен пункт даних в повідомленні з XDR в своє внутрішнє уявлення.
  • Кроки:
    1. Виклик xdrmem_create () для ініціалізації потоку XDR, вказавши XDR_DECODE, як четвертий аргумент.
    2. Приміщення отриманого повідомлення в буфер.
    3. Виклик підходящої стандартної програми перетворення для декодування кожного пункту даних отриманого повідомлення.

Наприклад, декодування 32-бітного цілого: