XDR (External Data Representation)

Aus dev.kaibel.net
Version vom 21. Oktober 2025, 13:18 Uhr von PhilKa (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „= 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. --- == Z…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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:

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 geschrieben
  • XDR_DECODE – Daten werden gelesen
  • XDR_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

---

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