mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
7055827b8f
This makes it clearer that we always want to do heimdal changes via the lorikeet-heimdal repository. Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Joseph Sutton <josephsutton@catalyst.net.nz> Autobuild-User(master): Joseph Sutton <jsutton@samba.org> Autobuild-Date(master): Wed Jan 19 21:41:59 UTC 2022 on sn-devel-184
1516 lines
54 KiB
Plaintext
1516 lines
54 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
Network Working Group M. Eisler, Ed.
|
||
Request for Comments: 4506 Network Appliance, Inc.
|
||
STD: 67 May 2006
|
||
Obsoletes: 1832
|
||
Category: Standards Track
|
||
|
||
|
||
XDR: External Data Representation Standard
|
||
|
||
Status of This Memo
|
||
|
||
This document specifies an Internet standards track protocol for the
|
||
Internet community, and requests discussion and suggestions for
|
||
improvements. Please refer to the current edition of the "Internet
|
||
Official Protocol Standards" (STD 1) for the standardization state
|
||
and status of this protocol. Distribution of this memo is unlimited.
|
||
|
||
Copyright Notice
|
||
|
||
Copyright (C) The Internet Society (2006).
|
||
|
||
Abstract
|
||
|
||
This document describes the External Data Representation Standard
|
||
(XDR) protocol as it is currently deployed and accepted. This
|
||
document obsoletes RFC 1832.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 1]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
Table of Contents
|
||
|
||
1. Introduction ....................................................3
|
||
2. Changes from RFC 1832 ...........................................3
|
||
3. Basic Block Size ................................................3
|
||
4. XDR Data Types ..................................................4
|
||
4.1. Integer ....................................................4
|
||
4.2. Unsigned Integer ...........................................4
|
||
4.3. Enumeration ................................................5
|
||
4.4. Boolean ....................................................5
|
||
4.5. Hyper Integer and Unsigned Hyper Integer ...................5
|
||
4.6. Floating-Point .............................................6
|
||
4.7. Double-Precision Floating-Point ............................7
|
||
4.8. Quadruple-Precision Floating-Point .........................8
|
||
4.9. Fixed-Length Opaque Data ...................................9
|
||
4.10. Variable-Length Opaque Data ...............................9
|
||
4.11. String ...................................................10
|
||
4.12. Fixed-Length Array .......................................11
|
||
4.13. Variable-Length Array ....................................11
|
||
4.14. Structure ................................................12
|
||
4.15. Discriminated Union ......................................12
|
||
4.16. Void .....................................................13
|
||
4.17. Constant .................................................13
|
||
4.18. Typedef ..................................................13
|
||
4.19. Optional-Data ............................................14
|
||
4.20. Areas for Future Enhancement .............................16
|
||
5. Discussion .....................................................16
|
||
6. The XDR Language Specification .................................17
|
||
6.1. Notational Conventions ....................................17
|
||
6.2. Lexical Notes .............................................18
|
||
6.3. Syntax Information ........................................18
|
||
6.4. Syntax Notes ..............................................20
|
||
7. An Example of an XDR Data Description ..........................21
|
||
8. Security Considerations ........................................22
|
||
9. IANA Considerations ............................................23
|
||
10. Trademarks and Owners .........................................23
|
||
11. ANSI/IEEE Standard 754-1985 ...................................24
|
||
12. Normative References ..........................................25
|
||
13. Informative References ........................................25
|
||
14. Acknowledgements ..............................................26
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 2]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
1. Introduction
|
||
|
||
XDR is a standard for the description and encoding of data. It is
|
||
useful for transferring data between different computer
|
||
architectures, and it has been used to communicate data between such
|
||
diverse machines as the SUN WORKSTATION*, VAX*, IBM-PC*, and Cray*.
|
||
XDR fits into the ISO presentation layer and is roughly analogous in
|
||
purpose to X.409, ISO Abstract Syntax Notation. The major difference
|
||
between these two is that XDR uses implicit typing, while X.409 uses
|
||
explicit typing.
|
||
|
||
XDR uses a language to describe data formats. The language can be
|
||
used only to describe data; it is not a programming language. This
|
||
language allows one to describe intricate data formats in a concise
|
||
manner. The alternative of using graphical representations (itself
|
||
an informal language) quickly becomes incomprehensible when faced
|
||
with complexity. The XDR language itself is similar to the C
|
||
language [KERN], just as Courier [COUR] is similar to Mesa.
|
||
Protocols such as ONC RPC (Remote Procedure Call) and the NFS*
|
||
(Network File System) use XDR to describe the format of their data.
|
||
|
||
The XDR standard makes the following assumption: that bytes (or
|
||
octets) are portable, where a byte is defined as 8 bits of data. A
|
||
given hardware device should encode the bytes onto the various media
|
||
in such a way that other hardware devices may decode the bytes
|
||
without loss of meaning. For example, the Ethernet* standard
|
||
suggests that bytes be encoded in "little-endian" style [COHE], or
|
||
least significant bit first.
|
||
|
||
2. Changes from RFC 1832
|
||
|
||
This document makes no technical changes to RFC 1832 and is published
|
||
for the purposes of noting IANA considerations, augmenting security
|
||
considerations, and distinguishing normative from informative
|
||
references.
|
||
|
||
3. Basic Block Size
|
||
|
||
The representation of all items requires a multiple of four bytes (or
|
||
32 bits) of data. The bytes are numbered 0 through n-1. The bytes
|
||
are read or written to some byte stream such that byte m always
|
||
precedes byte m+1. If the n bytes needed to contain the data are not
|
||
a multiple of four, then the n bytes are followed by enough (0 to 3)
|
||
residual zero bytes, r, to make the total byte count a multiple of 4.
|
||
|
||
We include the familiar graphic box notation for illustration and
|
||
comparison. In most illustrations, each box (delimited by a plus
|
||
sign at the 4 corners and vertical bars and dashes) depicts a byte.
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 3]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
Ellipses (...) between boxes show zero or more additional bytes where
|
||
required.
|
||
|
||
+--------+--------+...+--------+--------+...+--------+
|
||
| byte 0 | byte 1 |...|byte n-1| 0 |...| 0 | BLOCK
|
||
+--------+--------+...+--------+--------+...+--------+
|
||
|<-----------n bytes---------->|<------r bytes------>|
|
||
|<-----------n+r (where (n+r) mod 4 = 0)>----------->|
|
||
|
||
4. XDR Data Types
|
||
|
||
Each of the sections that follow describes a data type defined in the
|
||
XDR standard, shows how it is declared in the language, and includes
|
||
a graphic illustration of its encoding.
|
||
|
||
For each data type in the language we show a general paradigm
|
||
declaration. Note that angle brackets (< and >) denote variable-
|
||
length sequences of data and that square brackets ([ and ]) denote
|
||
fixed-length sequences of data. "n", "m", and "r" denote integers.
|
||
For the full language specification and more formal definitions of
|
||
terms such as "identifier" and "declaration", refer to Section 6,
|
||
"The XDR Language Specification".
|
||
|
||
For some data types, more specific examples are included. A more
|
||
extensive example of a data description is in Section 7, "An Example
|
||
of an XDR Data Description".
|
||
|
||
4.1. Integer
|
||
|
||
An XDR signed integer is a 32-bit datum that encodes an integer in
|
||
the range [-2147483648,2147483647]. The integer is represented in
|
||
two's complement notation. The most and least significant bytes are
|
||
0 and 3, respectively. Integers are declared as follows:
|
||
|
||
int identifier;
|
||
|
||
(MSB) (LSB)
|
||
+-------+-------+-------+-------+
|
||
|byte 0 |byte 1 |byte 2 |byte 3 | INTEGER
|
||
+-------+-------+-------+-------+
|
||
<------------32 bits------------>
|
||
|
||
4.2. Unsigned Integer
|
||
|
||
An XDR unsigned integer is a 32-bit datum that encodes a non-negative
|
||
integer in the range [0,4294967295]. It is represented by an
|
||
unsigned binary number whose most and least significant bytes are 0
|
||
and 3, respectively. An unsigned integer is declared as follows:
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 4]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
unsigned int identifier;
|
||
|
||
(MSB) (LSB)
|
||
+-------+-------+-------+-------+
|
||
|byte 0 |byte 1 |byte 2 |byte 3 | UNSIGNED INTEGER
|
||
+-------+-------+-------+-------+
|
||
<------------32 bits------------>
|
||
|
||
4.3. Enumeration
|
||
|
||
Enumerations have the same representation as signed integers.
|
||
Enumerations are handy for describing subsets of the integers.
|
||
Enumerated data is declared as follows:
|
||
|
||
enum { name-identifier = constant, ... } identifier;
|
||
|
||
For example, the three colors red, yellow, and blue could be
|
||
described by an enumerated type:
|
||
|
||
enum { RED = 2, YELLOW = 3, BLUE = 5 } colors;
|
||
|
||
It is an error to encode as an enum any integer other than those that
|
||
have been given assignments in the enum declaration.
|
||
|
||
4.4. Boolean
|
||
|
||
Booleans are important enough and occur frequently enough to warrant
|
||
their own explicit type in the standard. Booleans are declared as
|
||
follows:
|
||
|
||
bool identifier;
|
||
|
||
This is equivalent to:
|
||
|
||
enum { FALSE = 0, TRUE = 1 } identifier;
|
||
|
||
4.5. Hyper Integer and Unsigned Hyper Integer
|
||
|
||
The standard also defines 64-bit (8-byte) numbers called hyper
|
||
integers and unsigned hyper integers. Their representations are the
|
||
obvious extensions of integer and unsigned integer defined above.
|
||
They are represented in two's complement notation. The most and
|
||
least significant bytes are 0 and 7, respectively. Their
|
||
declarations:
|
||
|
||
hyper identifier; unsigned hyper identifier;
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 5]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
(MSB) (LSB)
|
||
+-------+-------+-------+-------+-------+-------+-------+-------+
|
||
|byte 0 |byte 1 |byte 2 |byte 3 |byte 4 |byte 5 |byte 6 |byte 7 |
|
||
+-------+-------+-------+-------+-------+-------+-------+-------+
|
||
<----------------------------64 bits---------------------------->
|
||
HYPER INTEGER
|
||
UNSIGNED HYPER INTEGER
|
||
|
||
4.6. Floating-Point
|
||
|
||
The standard defines the floating-point data type "float" (32 bits or
|
||
4 bytes). The encoding used is the IEEE standard for normalized
|
||
single-precision floating-point numbers [IEEE]. The following three
|
||
fields describe the single-precision floating-point number:
|
||
|
||
S: The sign of the number. Values 0 and 1 represent positive and
|
||
negative, respectively. One bit.
|
||
|
||
E: The exponent of the number, base 2. 8 bits are devoted to this
|
||
field. The exponent is biased by 127.
|
||
|
||
F: The fractional part of the number's mantissa, base 2. 23 bits
|
||
are devoted to this field.
|
||
|
||
Therefore, the floating-point number is described by:
|
||
|
||
(-1)**S * 2**(E-Bias) * 1.F
|
||
|
||
It is declared as follows:
|
||
|
||
float identifier;
|
||
|
||
+-------+-------+-------+-------+
|
||
|byte 0 |byte 1 |byte 2 |byte 3 | SINGLE-PRECISION
|
||
S| E | F | FLOATING-POINT NUMBER
|
||
+-------+-------+-------+-------+
|
||
1|<- 8 ->|<-------23 bits------>|
|
||
<------------32 bits------------>
|
||
|
||
Just as the most and least significant bytes of a number are 0 and 3,
|
||
the most and least significant bits of a single-precision floating-
|
||
point number are 0 and 31. The beginning bit (and most significant
|
||
bit) offsets of S, E, and F are 0, 1, and 9, respectively. Note that
|
||
these numbers refer to the mathematical positions of the bits, and
|
||
NOT to their actual physical locations (which vary from medium to
|
||
medium).
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 6]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
The IEEE specifications should be consulted concerning the encoding
|
||
for signed zero, signed infinity (overflow), and denormalized numbers
|
||
(underflow) [IEEE]. According to IEEE specifications, the "NaN" (not
|
||
a number) is system dependent and should not be interpreted within
|
||
XDR as anything other than "NaN".
|
||
|
||
4.7. Double-Precision Floating-Point
|
||
|
||
The standard defines the encoding for the double-precision floating-
|
||
point data type "double" (64 bits or 8 bytes). The encoding used is
|
||
the IEEE standard for normalized double-precision floating-point
|
||
numbers [IEEE]. The standard encodes the following three fields,
|
||
which describe the double-precision floating-point number:
|
||
|
||
S: The sign of the number. Values 0 and 1 represent positive and
|
||
negative, respectively. One bit.
|
||
|
||
E: The exponent of the number, base 2. 11 bits are devoted to
|
||
this field. The exponent is biased by 1023.
|
||
|
||
F: The fractional part of the number's mantissa, base 2. 52 bits
|
||
are devoted to this field.
|
||
|
||
Therefore, the floating-point number is described by:
|
||
|
||
(-1)**S * 2**(E-Bias) * 1.F
|
||
|
||
It is declared as follows:
|
||
|
||
double identifier;
|
||
|
||
+------+------+------+------+------+------+------+------+
|
||
|byte 0|byte 1|byte 2|byte 3|byte 4|byte 5|byte 6|byte 7|
|
||
S| E | F |
|
||
+------+------+------+------+------+------+------+------+
|
||
1|<--11-->|<-----------------52 bits------------------->|
|
||
<-----------------------64 bits------------------------->
|
||
DOUBLE-PRECISION FLOATING-POINT
|
||
|
||
Just as the most and least significant bytes of a number are 0 and 3,
|
||
the most and least significant bits of a double-precision floating-
|
||
point number are 0 and 63. The beginning bit (and most significant
|
||
bit) offsets of S, E, and F are 0, 1, and 12, respectively. Note
|
||
that these numbers refer to the mathematical positions of the bits,
|
||
and NOT to their actual physical locations (which vary from medium to
|
||
medium).
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 7]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
The IEEE specifications should be consulted concerning the encoding
|
||
for signed zero, signed infinity (overflow), and denormalized numbers
|
||
(underflow) [IEEE]. According to IEEE specifications, the "NaN" (not
|
||
a number) is system dependent and should not be interpreted within
|
||
XDR as anything other than "NaN".
|
||
|
||
4.8. Quadruple-Precision Floating-Point
|
||
|
||
The standard defines the encoding for the quadruple-precision
|
||
floating-point data type "quadruple" (128 bits or 16 bytes). The
|
||
encoding used is designed to be a simple analog of the encoding used
|
||
for single- and double-precision floating-point numbers using one
|
||
form of IEEE double extended precision. The standard encodes the
|
||
following three fields, which describe the quadruple-precision
|
||
floating-point number:
|
||
|
||
S: The sign of the number. Values 0 and 1 represent positive and
|
||
negative, respectively. One bit.
|
||
|
||
E: The exponent of the number, base 2. 15 bits are devoted to
|
||
this field. The exponent is biased by 16383.
|
||
|
||
F: The fractional part of the number's mantissa, base 2. 112 bits
|
||
are devoted to this field.
|
||
|
||
Therefore, the floating-point number is described by:
|
||
|
||
(-1)**S * 2**(E-Bias) * 1.F
|
||
|
||
It is declared as follows:
|
||
|
||
quadruple identifier;
|
||
|
||
+------+------+------+------+------+------+-...--+------+
|
||
|byte 0|byte 1|byte 2|byte 3|byte 4|byte 5| ... |byte15|
|
||
S| E | F |
|
||
+------+------+------+------+------+------+-...--+------+
|
||
1|<----15---->|<-------------112 bits------------------>|
|
||
<-----------------------128 bits------------------------>
|
||
QUADRUPLE-PRECISION FLOATING-POINT
|
||
|
||
Just as the most and least significant bytes of a number are 0 and 3,
|
||
the most and least significant bits of a quadruple-precision
|
||
floating-point number are 0 and 127. The beginning bit (and most
|
||
significant bit) offsets of S, E , and F are 0, 1, and 16,
|
||
respectively. Note that these numbers refer to the mathematical
|
||
positions of the bits, and NOT to their actual physical locations
|
||
(which vary from medium to medium).
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 8]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
The encoding for signed zero, signed infinity (overflow), and
|
||
denormalized numbers are analogs of the corresponding encodings for
|
||
single and double-precision floating-point numbers [SPAR], [HPRE].
|
||
The "NaN" encoding as it applies to quadruple-precision floating-
|
||
point numbers is system dependent and should not be interpreted
|
||
within XDR as anything other than "NaN".
|
||
|
||
4.9. Fixed-Length Opaque Data
|
||
|
||
At times, fixed-length uninterpreted data needs to be passed among
|
||
machines. This data is called "opaque" and is declared as follows:
|
||
|
||
opaque identifier[n];
|
||
|
||
where the constant n is the (static) number of bytes necessary to
|
||
contain the opaque data. If n is not a multiple of four, then the n
|
||
bytes are followed by enough (0 to 3) residual zero bytes, r, to make
|
||
the total byte count of the opaque object a multiple of four.
|
||
|
||
0 1 ...
|
||
+--------+--------+...+--------+--------+...+--------+
|
||
| byte 0 | byte 1 |...|byte n-1| 0 |...| 0 |
|
||
+--------+--------+...+--------+--------+...+--------+
|
||
|<-----------n bytes---------->|<------r bytes------>|
|
||
|<-----------n+r (where (n+r) mod 4 = 0)------------>|
|
||
FIXED-LENGTH OPAQUE
|
||
|
||
4.10. Variable-Length Opaque Data
|
||
|
||
The standard also provides for variable-length (counted) opaque data,
|
||
defined as a sequence of n (numbered 0 through n-1) arbitrary bytes
|
||
to be the number n encoded as an unsigned integer (as described
|
||
below), and followed by the n bytes of the sequence.
|
||
|
||
Byte m of the sequence always precedes byte m+1 of the sequence, and
|
||
byte 0 of the sequence always follows the sequence's length (count).
|
||
If n is not a multiple of four, then the n bytes are followed by
|
||
enough (0 to 3) residual zero bytes, r, to make the total byte count
|
||
a multiple of four. Variable-length opaque data is declared in the
|
||
following way:
|
||
|
||
opaque identifier<m>;
|
||
or
|
||
opaque identifier<>;
|
||
|
||
The constant m denotes an upper bound of the number of bytes that the
|
||
sequence may contain. If m is not specified, as in the second
|
||
declaration, it is assumed to be (2**32) - 1, the maximum length.
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 9]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
The constant m would normally be found in a protocol specification.
|
||
For example, a filing protocol may state that the maximum data
|
||
transfer size is 8192 bytes, as follows:
|
||
|
||
opaque filedata<8192>;
|
||
|
||
0 1 2 3 4 5 ...
|
||
+-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+
|
||
| length n |byte0|byte1|...| n-1 | 0 |...| 0 |
|
||
+-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+
|
||
|<-------4 bytes------->|<------n bytes------>|<---r bytes--->|
|
||
|<----n+r (where (n+r) mod 4 = 0)---->|
|
||
VARIABLE-LENGTH OPAQUE
|
||
|
||
It is an error to encode a length greater than the maximum described
|
||
in the specification.
|
||
|
||
4.11. String
|
||
|
||
The standard defines a string of n (numbered 0 through n-1) ASCII
|
||
bytes to be the number n encoded as an unsigned integer (as described
|
||
above), and followed by the n bytes of the string. Byte m of the
|
||
string always precedes byte m+1 of the string, and byte 0 of the
|
||
string always follows the string's length. If n is not a multiple of
|
||
four, then the n bytes are followed by enough (0 to 3) residual zero
|
||
bytes, r, to make the total byte count a multiple of four. Counted
|
||
byte strings are declared as follows:
|
||
|
||
string object<m>;
|
||
or
|
||
string object<>;
|
||
|
||
The constant m denotes an upper bound of the number of bytes that a
|
||
string may contain. If m is not specified, as in the second
|
||
declaration, it is assumed to be (2**32) - 1, the maximum length.
|
||
The constant m would normally be found in a protocol specification.
|
||
For example, a filing protocol may state that a file name can be no
|
||
longer than 255 bytes, as follows:
|
||
|
||
string filename<255>;
|
||
|
||
0 1 2 3 4 5 ...
|
||
+-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+
|
||
| length n |byte0|byte1|...| n-1 | 0 |...| 0 |
|
||
+-----+-----+-----+-----+-----+-----+...+-----+-----+...+-----+
|
||
|<-------4 bytes------->|<------n bytes------>|<---r bytes--->|
|
||
|<----n+r (where (n+r) mod 4 = 0)---->|
|
||
STRING
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 10]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
It is an error to encode a length greater than the maximum described
|
||
in the specification.
|
||
|
||
4.12. Fixed-Length Array
|
||
|
||
Declarations for fixed-length arrays of homogeneous elements are in
|
||
the following form:
|
||
|
||
type-name identifier[n];
|
||
|
||
Fixed-length arrays of elements numbered 0 through n-1 are encoded by
|
||
individually encoding the elements of the array in their natural
|
||
order, 0 through n-1. Each element's size is a multiple of four
|
||
bytes. Though all elements are of the same type, the elements may
|
||
have different sizes. For example, in a fixed-length array of
|
||
strings, all elements are of type "string", yet each element will
|
||
vary in its length.
|
||
|
||
+---+---+---+---+---+---+---+---+...+---+---+---+---+
|
||
| element 0 | element 1 |...| element n-1 |
|
||
+---+---+---+---+---+---+---+---+...+---+---+---+---+
|
||
|<--------------------n elements------------------->|
|
||
|
||
FIXED-LENGTH ARRAY
|
||
|
||
4.13. Variable-Length Array
|
||
|
||
Counted arrays provide the ability to encode variable-length arrays
|
||
of homogeneous elements. The array is encoded as the element count n
|
||
(an unsigned integer) followed by the encoding of each of the array's
|
||
elements, starting with element 0 and progressing through element
|
||
n-1. The declaration for variable-length arrays follows this form:
|
||
|
||
type-name identifier<m>;
|
||
or
|
||
type-name identifier<>;
|
||
|
||
The constant m specifies the maximum acceptable element count of an
|
||
array; if m is not specified, as in the second declaration, it is
|
||
assumed to be (2**32) - 1.
|
||
|
||
0 1 2 3
|
||
+--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+
|
||
| n | element 0 | element 1 |...|element n-1|
|
||
+--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+
|
||
|<-4 bytes->|<--------------n elements------------->|
|
||
COUNTED ARRAY
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 11]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
It is an error to encode a value of n that is greater than the
|
||
maximum described in the specification.
|
||
|
||
4.14. Structure
|
||
|
||
Structures are declared as follows:
|
||
|
||
struct {
|
||
component-declaration-A;
|
||
component-declaration-B;
|
||
...
|
||
} identifier;
|
||
|
||
The components of the structure are encoded in the order of their
|
||
declaration in the structure. Each component's size is a multiple of
|
||
four bytes, though the components may be different sizes.
|
||
|
||
+-------------+-------------+...
|
||
| component A | component B |... STRUCTURE
|
||
+-------------+-------------+...
|
||
|
||
4.15. Discriminated Union
|
||
|
||
A discriminated union is a type composed of a discriminant followed
|
||
by a type selected from a set of prearranged types according to the
|
||
value of the discriminant. The type of discriminant is either "int",
|
||
"unsigned int", or an enumerated type, such as "bool". The component
|
||
types are called "arms" of the union and are preceded by the value of
|
||
the discriminant that implies their encoding. Discriminated unions
|
||
are declared as follows:
|
||
|
||
union switch (discriminant-declaration) {
|
||
case discriminant-value-A:
|
||
arm-declaration-A;
|
||
case discriminant-value-B:
|
||
arm-declaration-B;
|
||
...
|
||
default: default-declaration;
|
||
} identifier;
|
||
|
||
Each "case" keyword is followed by a legal value of the discriminant.
|
||
The default arm is optional. If it is not specified, then a valid
|
||
encoding of the union cannot take on unspecified discriminant values.
|
||
The size of the implied arm is always a multiple of four bytes.
|
||
|
||
The discriminated union is encoded as its discriminant followed by
|
||
the encoding of the implied arm.
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 12]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
0 1 2 3
|
||
+---+---+---+---+---+---+---+---+
|
||
| discriminant | implied arm | DISCRIMINATED UNION
|
||
+---+---+---+---+---+---+---+---+
|
||
|<---4 bytes--->|
|
||
|
||
4.16. Void
|
||
|
||
An XDR void is a 0-byte quantity. Voids are useful for describing
|
||
operations that take no data as input or no data as output. They are
|
||
also useful in unions, where some arms may contain data and others do
|
||
not. The declaration is simply as follows:
|
||
|
||
void;
|
||
|
||
Voids are illustrated as follows:
|
||
|
||
++
|
||
|| VOID
|
||
++
|
||
--><-- 0 bytes
|
||
|
||
4.17. Constant
|
||
|
||
The data declaration for a constant follows this form:
|
||
|
||
const name-identifier = n;
|
||
|
||
"const" is used to define a symbolic name for a constant; it does not
|
||
declare any data. The symbolic constant may be used anywhere a
|
||
regular constant may be used. For example, the following defines a
|
||
symbolic constant DOZEN, equal to 12.
|
||
|
||
const DOZEN = 12;
|
||
|
||
4.18. Typedef
|
||
|
||
"typedef" does not declare any data either, but serves to define new
|
||
identifiers for declaring data. The syntax is:
|
||
|
||
typedef declaration;
|
||
|
||
The new type name is actually the variable name in the declaration
|
||
part of the typedef. For example, the following defines a new type
|
||
called "eggbox" using an existing type called "egg":
|
||
|
||
typedef egg eggbox[DOZEN];
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 13]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
Variables declared using the new type name have the same type as the
|
||
new type name would have in the typedef, if it were considered a
|
||
variable. For example, the following two declarations are equivalent
|
||
in declaring the variable "fresheggs":
|
||
|
||
eggbox fresheggs; egg fresheggs[DOZEN];
|
||
|
||
When a typedef involves a struct, enum, or union definition, there is
|
||
another (preferred) syntax that may be used to define the same type.
|
||
In general, a typedef of the following form:
|
||
|
||
typedef <<struct, union, or enum definition>> identifier;
|
||
|
||
may be converted to the alternative form by removing the "typedef"
|
||
part and placing the identifier after the "struct", "union", or
|
||
"enum" keyword, instead of at the end. For example, here are the two
|
||
ways to define the type "bool":
|
||
|
||
typedef enum { /* using typedef */
|
||
FALSE = 0,
|
||
TRUE = 1
|
||
} bool;
|
||
|
||
enum bool { /* preferred alternative */
|
||
FALSE = 0,
|
||
TRUE = 1
|
||
};
|
||
|
||
This syntax is preferred because one does not have to wait until the
|
||
end of a declaration to figure out the name of the new type.
|
||
|
||
4.19. Optional-Data
|
||
|
||
Optional-data is one kind of union that occurs so frequently that we
|
||
give it a special syntax of its own for declaring it. It is declared
|
||
as follows:
|
||
|
||
type-name *identifier;
|
||
|
||
This is equivalent to the following union:
|
||
|
||
union switch (bool opted) {
|
||
case TRUE:
|
||
type-name element;
|
||
case FALSE:
|
||
void;
|
||
} identifier;
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 14]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
It is also equivalent to the following variable-length array
|
||
declaration, since the boolean "opted" can be interpreted as the
|
||
length of the array:
|
||
|
||
type-name identifier<1>;
|
||
|
||
Optional-data is not so interesting in itself, but it is very useful
|
||
for describing recursive data-structures such as linked-lists and
|
||
trees. For example, the following defines a type "stringlist" that
|
||
encodes lists of zero or more arbitrary length strings:
|
||
|
||
struct stringentry {
|
||
string item<>;
|
||
stringentry *next;
|
||
};
|
||
|
||
typedef stringentry *stringlist;
|
||
|
||
It could have been equivalently declared as the following union:
|
||
|
||
union stringlist switch (bool opted) {
|
||
case TRUE:
|
||
struct {
|
||
string item<>;
|
||
stringlist next;
|
||
} element;
|
||
case FALSE:
|
||
void;
|
||
};
|
||
|
||
or as a variable-length array:
|
||
|
||
struct stringentry {
|
||
string item<>;
|
||
stringentry next<1>;
|
||
};
|
||
|
||
typedef stringentry stringlist<1>;
|
||
|
||
Both of these declarations obscure the intention of the stringlist
|
||
type, so the optional-data declaration is preferred over both of
|
||
them. The optional-data type also has a close correlation to how
|
||
recursive data structures are represented in high-level languages
|
||
such as Pascal or C by use of pointers. In fact, the syntax is the
|
||
same as that of the C language for pointers.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 15]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
4.20. Areas for Future Enhancement
|
||
|
||
The XDR standard lacks representations for bit fields and bitmaps,
|
||
since the standard is based on bytes. Also missing are packed (or
|
||
binary-coded) decimals.
|
||
|
||
The intent of the XDR standard was not to describe every kind of data
|
||
that people have ever sent or will ever want to send from machine to
|
||
machine. Rather, it only describes the most commonly used data-types
|
||
of high-level languages such as Pascal or C so that applications
|
||
written in these languages will be able to communicate easily over
|
||
some medium.
|
||
|
||
One could imagine extensions to XDR that would let it describe almost
|
||
any existing protocol, such as TCP. The minimum necessary for this
|
||
is support for different block sizes and byte-orders. The XDR
|
||
discussed here could then be considered the 4-byte big-endian member
|
||
of a larger XDR family.
|
||
|
||
5. Discussion
|
||
|
||
(1) Why use a language for describing data? What's wrong with
|
||
diagrams?
|
||
|
||
There are many advantages in using a data-description language such
|
||
as XDR versus using diagrams. Languages are more formal than
|
||
diagrams and lead to less ambiguous descriptions of data. Languages
|
||
are also easier to understand and allow one to think of other issues
|
||
instead of the low-level details of bit encoding. Also, there is a
|
||
close analogy between the types of XDR and a high-level language such
|
||
as C or Pascal. This makes the implementation of XDR encoding and
|
||
decoding modules an easier task. Finally, the language specification
|
||
itself is an ASCII string that can be passed from machine to machine
|
||
to perform on-the-fly data interpretation.
|
||
|
||
(2) Why is there only one byte-order for an XDR unit?
|
||
|
||
Supporting two byte-orderings requires a higher-level protocol for
|
||
determining in which byte-order the data is encoded. Since XDR is
|
||
not a protocol, this can't be done. The advantage of this, though,
|
||
is that data in XDR format can be written to a magnetic tape, for
|
||
example, and any machine will be able to interpret it, since no
|
||
higher-level protocol is necessary for determining the byte-order.
|
||
|
||
(3) Why is the XDR byte-order big-endian instead of little-endian?
|
||
Isn't this unfair to little-endian machines such as the VAX(r),
|
||
which has to convert from one form to the other?
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 16]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
Yes, it is unfair, but having only one byte-order means you have to
|
||
be unfair to somebody. Many architectures, such as the Motorola
|
||
68000* and IBM 370*, support the big-endian byte-order.
|
||
|
||
(4) Why is the XDR unit four bytes wide?
|
||
|
||
There is a tradeoff in choosing the XDR unit size. Choosing a small
|
||
size, such as two, makes the encoded data small, but causes alignment
|
||
problems for machines that aren't aligned on these boundaries. A
|
||
large size, such as eight, means the data will be aligned on
|
||
virtually every machine, but causes the encoded data to grow too big.
|
||
We chose four as a compromise. Four is big enough to support most
|
||
architectures efficiently, except for rare machines such as the
|
||
eight-byte-aligned Cray*. Four is also small enough to keep the
|
||
encoded data restricted to a reasonable size.
|
||
|
||
(5) Why must variable-length data be padded with zeros?
|
||
|
||
It is desirable that the same data encode into the same thing on all
|
||
machines, so that encoded data can be meaningfully compared or
|
||
checksummed. Forcing the padded bytes to be zero ensures this.
|
||
|
||
(6) Why is there no explicit data-typing?
|
||
|
||
Data-typing has a relatively high cost for what small advantages it
|
||
may have. One cost is the expansion of data due to the inserted type
|
||
fields. Another is the added cost of interpreting these type fields
|
||
and acting accordingly. And most protocols already know what type
|
||
they expect, so data-typing supplies only redundant information.
|
||
However, one can still get the benefits of data-typing using XDR.
|
||
One way is to encode two things: first, a string that is the XDR data
|
||
description of the encoded data, and then the encoded data itself.
|
||
Another way is to assign a value to all the types in XDR, and then
|
||
define a universal type that takes this value as its discriminant and
|
||
for each value, describes the corresponding data type.
|
||
|
||
6. The XDR Language Specification
|
||
|
||
6.1. Notational Conventions
|
||
|
||
This specification uses an extended Back-Naur Form notation for
|
||
describing the XDR language. Here is a brief description of the
|
||
notation:
|
||
|
||
(1) The characters '|', '(', ')', '[', ']', '"', and '*' are special.
|
||
(2) Terminal symbols are strings of any characters surrounded by
|
||
double quotes. (3) Non-terminal symbols are strings of non-special
|
||
characters. (4) Alternative items are separated by a vertical bar
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 17]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
("|"). (5) Optional items are enclosed in brackets. (6) Items are
|
||
grouped together by enclosing them in parentheses. (7) A '*'
|
||
following an item means 0 or more occurrences of that item.
|
||
|
||
For example, consider the following pattern:
|
||
|
||
"a " "very" (", " "very")* [" cold " "and "] " rainy "
|
||
("day" | "night")
|
||
|
||
An infinite number of strings match this pattern. A few of them are:
|
||
|
||
"a very rainy day"
|
||
"a very, very rainy day"
|
||
"a very cold and rainy day"
|
||
"a very, very, very cold and rainy night"
|
||
|
||
6.2. Lexical Notes
|
||
|
||
(1) Comments begin with '/*' and terminate with '*/'. (2) White
|
||
space serves to separate items and is otherwise ignored. (3) An
|
||
identifier is a letter followed by an optional sequence of letters,
|
||
digits, or underbar ('_'). The case of identifiers is not ignored.
|
||
(4) A decimal constant expresses a number in base 10 and is a
|
||
sequence of one or more decimal digits, where the first digit is not
|
||
a zero, and is optionally preceded by a minus-sign ('-'). (5) A
|
||
hexadecimal constant expresses a number in base 16, and must be
|
||
preceded by '0x', followed by one or hexadecimal digits ('A', 'B',
|
||
'C', 'D', E', 'F', 'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3',
|
||
'4', '5', '6', '7', '8', '9'). (6) An octal constant expresses a
|
||
number in base 8, always leads with digit 0, and is a sequence of one
|
||
or more octal digits ('0', '1', '2', '3', '4', '5', '6', '7').
|
||
|
||
6.3. Syntax Information
|
||
|
||
declaration:
|
||
type-specifier identifier
|
||
| type-specifier identifier "[" value "]"
|
||
| type-specifier identifier "<" [ value ] ">"
|
||
| "opaque" identifier "[" value "]"
|
||
| "opaque" identifier "<" [ value ] ">"
|
||
| "string" identifier "<" [ value ] ">"
|
||
| type-specifier "*" identifier
|
||
| "void"
|
||
|
||
value:
|
||
constant
|
||
| identifier
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 18]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
constant:
|
||
decimal-constant | hexadecimal-constant | octal-constant
|
||
|
||
type-specifier:
|
||
[ "unsigned" ] "int"
|
||
| [ "unsigned" ] "hyper"
|
||
| "float"
|
||
| "double"
|
||
| "quadruple"
|
||
| "bool"
|
||
| enum-type-spec
|
||
| struct-type-spec
|
||
| union-type-spec
|
||
| identifier
|
||
|
||
enum-type-spec:
|
||
"enum" enum-body
|
||
|
||
enum-body:
|
||
"{"
|
||
( identifier "=" value )
|
||
( "," identifier "=" value )*
|
||
"}"
|
||
|
||
struct-type-spec:
|
||
"struct" struct-body
|
||
|
||
struct-body:
|
||
"{"
|
||
( declaration ";" )
|
||
( declaration ";" )*
|
||
"}"
|
||
|
||
union-type-spec:
|
||
"union" union-body
|
||
|
||
union-body:
|
||
"switch" "(" declaration ")" "{"
|
||
case-spec
|
||
case-spec *
|
||
[ "default" ":" declaration ";" ]
|
||
"}"
|
||
|
||
case-spec:
|
||
( "case" value ":")
|
||
( "case" value ":") *
|
||
declaration ";"
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 19]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
constant-def:
|
||
"const" identifier "=" constant ";"
|
||
|
||
type-def:
|
||
"typedef" declaration ";"
|
||
| "enum" identifier enum-body ";"
|
||
| "struct" identifier struct-body ";"
|
||
| "union" identifier union-body ";"
|
||
|
||
definition:
|
||
type-def
|
||
| constant-def
|
||
|
||
specification:
|
||
definition *
|
||
|
||
6.4. Syntax Notes
|
||
|
||
(1) The following are keywords and cannot be used as identifiers:
|
||
"bool", "case", "const", "default", "double", "quadruple", "enum",
|
||
"float", "hyper", "int", "opaque", "string", "struct", "switch",
|
||
"typedef", "union", "unsigned", and "void".
|
||
|
||
(2) Only unsigned constants may be used as size specifications for
|
||
arrays. If an identifier is used, it must have been declared
|
||
previously as an unsigned constant in a "const" definition.
|
||
|
||
(3) Constant and type identifiers within the scope of a specification
|
||
are in the same name space and must be declared uniquely within this
|
||
scope.
|
||
|
||
(4) Similarly, variable names must be unique within the scope of
|
||
struct and union declarations. Nested struct and union declarations
|
||
create new scopes.
|
||
|
||
(5) The discriminant of a union must be of a type that evaluates to
|
||
an integer. That is, "int", "unsigned int", "bool", an enumerated
|
||
type, or any typedefed type that evaluates to one of these is legal.
|
||
Also, the case values must be one of the legal values of the
|
||
discriminant. Finally, a case value may not be specified more than
|
||
once within the scope of a union declaration.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 20]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
7. An Example of an XDR Data Description
|
||
|
||
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 */
|
||
|
||
/*
|
||
* 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 */
|
||
};
|
||
|
||
Suppose now that 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:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 21]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
OFFSET HEX BYTES ASCII COMMENTS
|
||
------ --------- ----- --------
|
||
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
|
||
|
||
8. Security Considerations
|
||
|
||
XDR is a data description language, not a protocol, and hence it does
|
||
not inherently give rise to any particular security considerations.
|
||
Protocols that carry XDR-formatted data, such as NFSv4, are
|
||
responsible for providing any necessary security services to secure
|
||
the data they transport.
|
||
|
||
Care must be take to properly encode and decode data to avoid
|
||
attacks. Known and avoidable risks include:
|
||
|
||
* Buffer overflow attacks. Where feasible, protocols should be
|
||
defined with explicit limits (via the "<" [ value ] ">" notation
|
||
instead of "<" ">") on elements with variable-length data types.
|
||
Regardless of the feasibility of an explicit limit on the
|
||
variable length of an element of a given protocol, decoders need
|
||
to ensure the incoming size does not exceed the length of any
|
||
provisioned receiver buffers.
|
||
|
||
* Nul octets embedded in an encoded value of type string. If the
|
||
decoder's native string format uses nul-terminated strings, then
|
||
the apparent size of the decoded object will be less than the
|
||
amount of memory allocated for the string. Some memory
|
||
deallocation interfaces take a size argument. The caller of the
|
||
deallocation interface would likely determine the size of the
|
||
string by counting to the location of the nul octet and adding
|
||
one. This discrepancy can cause memory leakage (because less
|
||
memory is actually returned to the free pool than allocated),
|
||
leading to system failure and a denial of service attack.
|
||
|
||
* Decoding of characters in strings that are legal ASCII
|
||
characters but nonetheless are illegal for the intended
|
||
application. For example, some operating systems treat the '/'
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 22]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
character as a component separator in path names. For a
|
||
protocol that encodes a string in the argument to a file
|
||
creation operation, the decoder needs to ensure that '/' is not
|
||
inside the component name. Otherwise, a file with an illegal
|
||
'/' in its name will be created, making it difficult to remove,
|
||
and is therefore a denial of service attack.
|
||
|
||
* Denial of service caused by recursive decoder or encoder
|
||
subroutines. A recursive decoder or encoder might process data
|
||
that has a structured type with a member of type optional data
|
||
that directly or indirectly refers to the structured type (i.e.,
|
||
a linked list). For example,
|
||
|
||
struct m {
|
||
int x;
|
||
struct m *next;
|
||
};
|
||
|
||
An encoder or decoder subroutine might be written to recursively
|
||
call itself each time another element of type "struct m" is
|
||
found. An attacker could construct a long linked list of
|
||
"struct m" elements in the request or response, which then
|
||
causes a stack overflow on the decoder or encoder. Decoders and
|
||
encoders should be written non-recursively or impose a limit on
|
||
list length.
|
||
|
||
9. IANA Considerations
|
||
|
||
It is possible, if not likely, that new data types will be added to
|
||
XDR in the future. The process for adding new types is via a
|
||
standards track RFC and not registration of new types with IANA.
|
||
Standards track RFCs that update or replace this document should be
|
||
documented as such in the RFC Editor's database of RFCs.
|
||
|
||
10. Trademarks and Owners
|
||
|
||
SUN WORKSTATION Sun Microsystems, Inc.
|
||
VAX Hewlett-Packard Company
|
||
IBM-PC International Business Machines Corporation
|
||
Cray Cray Inc.
|
||
NFS Sun Microsystems, Inc.
|
||
Ethernet Xerox Corporation.
|
||
Motorola 68000 Motorola, Inc.
|
||
IBM 370 International Business Machines Corporation
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 23]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
11. ANSI/IEEE Standard 754-1985
|
||
|
||
The definition of NaNs, signed zero and infinity, and denormalized
|
||
numbers from [IEEE] is reproduced here for convenience. The
|
||
definitions for quadruple-precision floating point numbers are
|
||
analogs of those for single and double-precision floating point
|
||
numbers and are defined in [IEEE].
|
||
|
||
In the following, 'S' stands for the sign bit, 'E' for the exponent,
|
||
and 'F' for the fractional part. The symbol 'u' stands for an
|
||
undefined bit (0 or 1).
|
||
|
||
For single-precision floating point numbers:
|
||
|
||
Type S (1 bit) E (8 bits) F (23 bits)
|
||
---- --------- ---------- -----------
|
||
signalling NaN u 255 (max) .0uuuuu---u
|
||
(with at least
|
||
one 1 bit)
|
||
quiet NaN u 255 (max) .1uuuuu---u
|
||
|
||
negative infinity 1 255 (max) .000000---0
|
||
|
||
positive infinity 0 255 (max) .000000---0
|
||
|
||
negative zero 1 0 .000000---0
|
||
|
||
positive zero 0 0 .000000---0
|
||
|
||
For double-precision floating point numbers:
|
||
|
||
Type S (1 bit) E (11 bits) F (52 bits)
|
||
---- --------- ----------- -----------
|
||
signalling NaN u 2047 (max) .0uuuuu---u
|
||
(with at least
|
||
one 1 bit)
|
||
quiet NaN u 2047 (max) .1uuuuu---u
|
||
|
||
negative infinity 1 2047 (max) .000000---0
|
||
|
||
positive infinity 0 2047 (max) .000000---0
|
||
|
||
negative zero 1 0 .000000---0
|
||
|
||
positive zero 0 0 .000000---0
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 24]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
For quadruple-precision floating point numbers:
|
||
|
||
Type S (1 bit) E (15 bits) F (112 bits)
|
||
---- --------- ----------- ------------
|
||
signalling NaN u 32767 (max) .0uuuuu---u
|
||
(with at least
|
||
one 1 bit)
|
||
quiet NaN u 32767 (max) .1uuuuu---u
|
||
|
||
negative infinity 1 32767 (max) .000000---0
|
||
|
||
positive infinity 0 32767 (max) .000000---0
|
||
|
||
negative zero 1 0 .000000---0
|
||
|
||
positive zero 0 0 .000000---0
|
||
|
||
Subnormal numbers are represented as follows:
|
||
|
||
Precision Exponent Value
|
||
--------- -------- -----
|
||
Single 0 (-1)**S * 2**(-126) * 0.F
|
||
|
||
Double 0 (-1)**S * 2**(-1022) * 0.F
|
||
|
||
Quadruple 0 (-1)**S * 2**(-16382) * 0.F
|
||
|
||
12. Normative References
|
||
|
||
[IEEE] "IEEE Standard for Binary Floating-Point Arithmetic",
|
||
ANSI/IEEE Standard 754-1985, Institute of Electrical and
|
||
Electronics Engineers, August 1985.
|
||
|
||
13. Informative References
|
||
|
||
[KERN] Brian W. Kernighan & Dennis M. Ritchie, "The C Programming
|
||
Language", Bell Laboratories, Murray Hill, New Jersey, 1978.
|
||
|
||
[COHE] Danny Cohen, "On Holy Wars and a Plea for Peace", IEEE
|
||
Computer, October 1981.
|
||
|
||
[COUR] "Courier: The Remote Procedure Call Protocol", XEROX
|
||
Corporation, XSIS 038112, December 1981.
|
||
|
||
[SPAR] "The SPARC Architecture Manual: Version 8", Prentice Hall,
|
||
ISBN 0-13-825001-4.
|
||
|
||
[HPRE] "HP Precision Architecture Handbook", June 1987, 5954-9906.
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 25]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
14. Acknowledgements
|
||
|
||
Bob Lyon was Sun's visible force behind ONC RPC in the 1980s. Sun
|
||
Microsystems, Inc., is listed as the author of RFC 1014. Raj
|
||
Srinivasan and the rest of the old ONC RPC working group edited RFC
|
||
1014 into RFC 1832, from which this document is derived. Mike Eisler
|
||
and Bill Janssen submitted the implementation reports for this
|
||
standard. Kevin Coffman, Benny Halevy, and Jon Peterson reviewed
|
||
this document and gave feedback. Peter Astrand and Bryan Olson
|
||
pointed out several errors in RFC 1832 which are corrected in this
|
||
document.
|
||
|
||
Editor's Address
|
||
|
||
Mike Eisler
|
||
5765 Chase Point Circle
|
||
Colorado Springs, CO 80919
|
||
USA
|
||
|
||
Phone: 719-599-9026
|
||
EMail: email2mre-rfc4506@yahoo.com
|
||
|
||
Please address comments to: nfsv4@ietf.org
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 26]
|
||
|
||
RFC 4506 XDR: External Data Representation Standard May 2006
|
||
|
||
|
||
Full Copyright Statement
|
||
|
||
Copyright (C) The Internet Society (2006).
|
||
|
||
This document is subject to the rights, licenses and restrictions
|
||
contained in BCP 78, and except as set forth therein, the authors
|
||
retain all their rights.
|
||
|
||
This document and the information contained herein are provided on an
|
||
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
|
||
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
|
||
ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
|
||
INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
|
||
INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
|
||
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||
|
||
Intellectual Property
|
||
|
||
The IETF takes no position regarding the validity or scope of any
|
||
Intellectual Property Rights or other rights that might be claimed to
|
||
pertain to the implementation or use of the technology described in
|
||
this document or the extent to which any license under such rights
|
||
might or might not be available; nor does it represent that it has
|
||
made any independent effort to identify any such rights. Information
|
||
on the procedures with respect to rights in RFC documents can be
|
||
found in BCP 78 and BCP 79.
|
||
|
||
Copies of IPR disclosures made to the IETF Secretariat and any
|
||
assurances of licenses to be made available, or the result of an
|
||
attempt made to obtain a general license or permission for the use of
|
||
such proprietary rights by implementers or users of this
|
||
specification can be obtained from the IETF on-line IPR repository at
|
||
http://www.ietf.org/ipr.
|
||
|
||
The IETF invites any interested party to bring to its attention any
|
||
copyrights, patents or patent applications, or other proprietary
|
||
rights that may cover technology that may be required to implement
|
||
this standard. Please address the information to the IETF at
|
||
ietf-ipr@ietf.org.
|
||
|
||
Acknowledgement
|
||
|
||
Funding for the RFC Editor function is provided by the IETF
|
||
Administrative Support Activity (IASA).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Eisler Standards Track [Page 27]
|
||
|