The following short eXternal Data Representation (XDR) data description of a file can be used to transfer files from one machine to another:
const MAXUSERNAME = 32;     /*  max length of a user name  */
const MAXFILELEN = 65535;   /*  max length of a file       */
const MAXNAMELEN = 255;     /*  max length of a file name  */
/*
 * Types of files:
 */
enum filekind {
    TEXT = 0,       /*  ascii data  */
    DATA = 1,       /*  raw data    */
    EXEC = 2        /*  executable  */
};
/*
 * File information, per kind of file:
 */
union filetype switch (filekind kind) {
    case TEXT:
        void;                /*  no extra information  */
    case DATA:
        string creator<MAXNAMELEN>;   /*  data creator  */
    case EXEC:
        string interpretor<MAXNAMELEN>; /* program interpretor */
};
/*
 * A complete file:
 */
struct file {
    string filename<MAXNAMELEN>; /*  name of file  */
    filetype type;               /*  info about file  */
    string owner<MAXUSERNAME>;   /*  owner of file    */
    opaque data<MAXFILELEN>;     /*  file data        */
};
If a user named john wants to store his sillyprog LISP program, which contains just the data (quit ), his file can be encoded as follows:
| Offset | Hex Bytes | ASCII | Description | 
| 0 | 00 00 00 09 | ... | Length of file name = 9 | 
| 4 | 73 69 6c 6c | sill | File name characters | 
| 8 | 79 70 72 6f | ypro | ... and more characters ... | 
| 12 | 67 00 00 00 | g... | ... and 3 zero-bytes of fill | 
| 16 | 00 00 00 02 | ... | File type is EXEC = 2 | 
| 20 | 00 00 00 04 | ... | Length of owner = 4 | 
| 24 | 6c 69 73 70 | lisp | Interpretor characters | 
| 28 | 00 00 00 04 | ... | Length of owner = 4 | 
| 32 | 6a 6f 68 6e | john | Owner characters | 
| 36 | 00 00 00 06 | ... | Length of file data = 6 | 
| 40 | 28 71 75 69 | (qui | File data bytes ... | 
| 44 | 74 29 00 00 | t).. | ... and 2 zero-bytes of fill |