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 |