XDR (External Data Representation)
XDR (External Data Representation)
XDR steht für External Data Representation und bezeichnet ein standardisiertes Datenformat, das entwickelt wurde, um Daten zwischen verschiedenen Computersystemen plattform- und architekturunabhängig auszutauschen. Es wurde ursprünglich von Sun Microsystems für das ONC-RPC-System (Open Network Computing Remote Procedure Call) entwickelt und in RFC 4506 spezifiziert.
---
Zweck
Unterschiedliche Rechnerarchitekturen speichern Daten in verschiedenen binären Formaten:
- verschiedene Endianness (Big-Endian / Little-Endian)
- unterschiedliche Größen für Datentypen
- abweichende Ausrichtung im Speicher (Alignment)
Das Ziel von XDR ist es, diese Unterschiede zu abstrahieren, indem es ein **einheitliches, portables Binärformat** für den Datenaustausch definiert.
Lokale Daten → XDR-Kodierung → Übertragung → XDR-Dekodierung → Lokale Daten
---
Verwendung
XDR wird in der Praxis hauptsächlich zusammen mit:
- rpcgen (C-Werkzeug),
- Remote Procedure Call (RPC),
- und Netzwerkprotokollen wie NFS (Network File System)
eingesetzt, um sicherzustellen, dass Daten korrekt zwischen verschiedenen Plattformen übertragen werden.
---
Grundprinzip
XDR basiert auf einem einfachen Konzept:
Jeder komplexe Datentyp (z. B. Struktur oder Array) wird in elementare Datentypen (Integer, Float, String, etc.) zerlegt, die nach klar definierten Regeln in ein Netzwerkformat konvertiert werden.
Jede XDR-Funktion kann in zwei Richtungen arbeiten:
- **ENCODE** – Daten werden in XDR-Format (Netzwerkbyteordnung) umgewandelt.
- **DECODE** – XDR-Daten werden zurück in das lokale Format konvertiert.
---
Unterstützte Datentypen
XDR unterstützt primitive und zusammengesetzte Typen:
| Typ | Beschreibung |
|---|---|
int |
32-Bit-Ganzzahl (Big-Endian) |
unsigned int |
32-Bit ohne Vorzeichen |
bool_t |
Wahrheitswert (0 oder 1) |
float, double |
IEEE 754-Gleitkommazahlen |
string |
Längenpräfix + Zeichenkette |
array |
Längenpräfix + Elemente |
struct |
Reihenfolge der Felder |
union |
Tag + aktives Feld |
---
XDR-Funktionen in C
Das XDR-System wird in C durch den Datentyp XDR und eine Sammlung von Funktionen aus <rpc/xdr.h> bereitgestellt.
Beispielhafte Funktionssignaturen:
bool_t xdr_int(XDR* xdrs, int* ip);
bool_t xdr_float(XDR* xdrs, float* fp);
bool_t xdr_string(XDR* xdrs, char** sp, u_int maxsize);
bool_t xdr_array(XDR* xdrs, char** arrp, u_int* sizep,
u_int maxsize, u_int elsize, xdrproc_t elproc);
Jede Funktion gibt einen booleschen Wert (TRUE / FALSE) zurück, abhängig davon, ob die (De-)Serialisierung erfolgreich war.
---
Beispiel: XDR für eine Struktur
#include <rpc/xdr.h>
struct intpair {
int a;
int b;
};
bool_t xdr_intpair(XDR *xdrs, struct intpair *objp) {
if (!xdr_int(xdrs, &objp->a))
return FALSE;
if (!xdr_int(xdrs, &objp->b))
return FALSE;
return TRUE;
}
Diese Funktion wandelt eine struct intpair beim Senden (ENCODE) oder Empfangen (DECODE) automatisch um.
---
Beispiel: Verwendung mit Speicherpuffer
#include <stdio.h>
#include <rpc/xdr.h>
int main() {
XDR xdrs;
char buffer[100];
struct intpair p1 = { 10, 20 }, p2;
// ENCODE: In XDR-Format schreiben
xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_ENCODE);
xdr_intpair(&xdrs, &p1);
xdr_destroy(&xdrs);
// DECODE: Aus XDR-Format lesen
xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_DECODE);
xdr_intpair(&xdrs, &p2);
xdr_destroy(&xdrs);
printf("Dekodiert: a=%d, b=%d\n", p2.a, p2.b);
return 0;
}
---
XDR-Streams
Der XDR-Strukturtyp definiert, wie die Daten gelesen oder geschrieben werden:
XDR_ENCODE– Daten werden geschriebenXDR_DECODE– Daten werden gelesenXDR_FREE– Speicher wird freigegeben
Arten von Streams:
xdrmem_create()– Speicherbasiert (Buffer)xdrstdio_create()– Dateibasiert (FILE*)xdrrec_create()– für Socket- oder Netzwerkverbindungen
---
Aufbau eines XDR-Datenstroms
Beispielhafter Ablauf:
+------------+------------+------------+------------+ | int (4B) | int (4B) | string len | string ... | +------------+------------+------------+------------+ | 0x00 00 00 0A | 0x00 00 00 14 | 0x00 00 00 05 | H e l l o |
Alle Werte werden **Big-Endian** (höchstwertiges Byte zuerst) gespeichert, unabhängig von der CPU-Architektur des sendenden oder empfangenden Systems.
---
Integration mit RPC
Bei rpcgen (C-Werkzeug) wird für jede in der .x-Datei definierte Struktur automatisch eine passende XDR-Funktion generiert (z. B. xdr_intpair()).
Diese Funktionen sorgen für die plattformübergreifende Datenübertragung zwischen Client und Server.
Client Server ------------------------------------------- | Daten → XDR_ENCODE → Netzwerk → XDR_DECODE | -------------------------------------------
---
Vorteile
- Plattformunabhängige Darstellung von Daten
- Automatische (De-)Serialisierung mit rpcgen
- Unterstützt komplexe Datentypen
- Einfach erweiterbar
Nachteile
- Binärformat – nicht direkt menschenlesbar
- Zusatzaufwand bei der Implementierung ohne rpcgen
- Weniger verbreitet in modernen Systemen (z. B. ersetzt durch Protobuf, JSON, gRPC)
---
Vergleich zu anderen Formaten
| Format | Typ | Eigenschaften |
|---|---|---|
| XDR | Binär | Standardisiert (RFC 4506), effizient, älter |
| JSON | Text | Leicht lesbar, aber größer und langsamer |
| XML | Text | Plattformunabhängig, aber komplex und redundant |
| Protocol Buffers | Binär | Kompakter, moderner Ersatz (Google) |
---
Siehe auch
- rpcgen (C-Werkzeug)
- Remote Procedure Call (RPC)
- Marshalling (Informatik)
- Stub (Softwareentwicklung)
- Network File System (NFS)
---
Quellen
- RFC 4506 – XDR: External Data Representation Standard
- Sun Microsystems: RPC Programming Guide
- Stevens, W. Richard: UNIX Network Programming, Vol. 1
- Linux Manual:
man 3 xdr - GNU C Library Documentation