XDR
External Data Representation (XDR)
External Data Representation (XDR) ist ein standardisiertes Format zur plattformunabhängigen Kodierung von Daten. Es wurde von Sun Microsystems entwickelt und in RFC 4506 spezifiziert. XDR ist integraler Bestandteil von ONC RPC und dient dazu, Daten zwischen Systemen unterschiedlicher Architektur sicher und eindeutig zu übertragen.
Hauptmerkmale von XDR:
- Plattformunabhängigkeit – definiert feste Größen und Big-Endian-Byteordnung.
- Definierte Basistypen – Integer, Float, Double, String, Arrays, Strukturen und Unions.
- Erweiterbarkeit – unterstützt komplexe Datentypen und verschachtelte Strukturen.
- Kompatibilität – ermöglicht interoperable Kommunikation zwischen unterschiedlichen Hard- und Softwareplattformen.
XDR trennt die Logik der Anwendung von der Datenkodierung. Dies macht es einfacher, RPC-Schnittstellen zu entwickeln, die langfristig stabil und zwischen vielen Systemen kompatibel bleiben.
Beispiel: Serialisierung mit XDR (C)
Das folgende Beispiel zeigt, wie eine einfache Datenstruktur mit XDR serialisiert (geschrieben) und deserialisiert (gelesen) wird.
#include <rpc/xdr.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
float wert;
} daten_t;
/* Funktion zur XDR-Kodierung und -Dekodierung */
bool_t xdr_daten(XDR *xdrs, daten_t *d) {
return (xdr_int(xdrs, &d->id) &&
xdr_float(xdrs, &d->wert));
}
int main() {
daten_t original = {42, 3.14f};
daten_t empfangen = {0, 0.0f};
/* Serialisierung in Speicher */
char buffer[100];
XDR xdr_encode;
xdrmem_create(&xdr_encode, buffer, sizeof(buffer), XDR_ENCODE);
xdr_daten(&xdr_encode, &original);
xdr_destroy(&xdr_encode);
/* Deserialisierung aus Speicher */
XDR xdr_decode;
xdrmem_create(&xdr_decode, buffer, sizeof(buffer), XDR_DECODE);
xdr_daten(&xdr_decode, &empfangen);
xdr_destroy(&xdr_decode);
printf("Empfangen: ID=%d, Wert=%f\n", empfangen.id, empfangen.wert);
return 0;
}
Dieses Beispiel:
- Definiert eine einfache Struktur mit einem Integer und einem Float.
- Kodiert die Daten in ein Byte-Array (Serialisierung).
- Dekodiert die Daten wieder aus dem Byte-Array (Deserialisierung).
Auf diese Weise können Daten sicher und plattformunabhängig zwischen Systemen übertragen werden.