<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=XDR_%28External_Data_Representation%29</id>
	<title>XDR (External Data Representation) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=XDR_%28External_Data_Representation%29"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=XDR_(External_Data_Representation)&amp;action=history"/>
	<updated>2026-06-26T02:13:45Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in dev.kaibel.net</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=XDR_(External_Data_Representation)&amp;diff=59&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „= XDR (External Data Representation) =  &#039;&#039;&#039;XDR&#039;&#039;&#039; steht für &#039;&#039;&#039;External Data Representation&#039;&#039;&#039; und bezeichnet ein standardisiertes Datenformat, das entwickelt wurde, um Daten zwischen verschiedenen Computersystemen &#039;&#039;&#039;plattform- und architekturunabhängig&#039;&#039;&#039; auszutauschen.   Es wurde ursprünglich von &#039;&#039;&#039;Sun Microsystems&#039;&#039;&#039; für das &#039;&#039;&#039;ONC-RPC-System&#039;&#039;&#039; (Open Network Computing Remote Procedure Call) entwickelt und in RFC 4506 spezifiziert.  ---  == Z…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=XDR_(External_Data_Representation)&amp;diff=59&amp;oldid=prev"/>
		<updated>2025-10-21T12:18:33Z</updated>

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