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 |