|
|
Here is a short XDR data description of a thing called a file, which might 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 */Suppose there is a user named john who wants to store his Lisp program sillyprog that contains just the data (quit). His file would be encoded as follows:/* 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 */ };
Offset | Hex bytes | ASCII | Description |
---|---|---|---|
0 | 00 00 00 09 | .... | Length of filename = 9 |
4 | 73 69 6c 6c | sill | Filename 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 | .... | Filekind is EXEC = 2 |
20 | 00 00 00 04 | .... | Length of interpretor = 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 |