Skip to content

RFC 4506 - XDR: External Data Representation Standard

XDR uses a language to describe data formats. The language can be used only to describe data; it is not a programming language.

XDR 是一种用来描述数据格式的语言。和 C 语言比较类似。

+--------+--------+...+--------+--------+...+--------+
| byte 0 | byte 1 |...|byte n-1|    0   |...|    0   |   BLOCK
+--------+--------+...+--------+--------+...+--------+
|<-----------n bytes---------->|<------r bytes------>|
|<-----------n+r (where (n+r) mod 4 = 0)>----------->|

XDR 数据的 item 总是由 4 字节的 block 组成。如果 item 长度不是 4 的倍数,会用 0 补齐。

XDR 定义以下数据类型:

英文 中文 类型名 说明
Integer 整数 int 32 bits
Unsigned Integer 无符号整数 unsigned int 32 bits
Enumeration 枚举 enum { name-identifier = constant, ... }
Boolean 布尔 bool
Hyper Integer and Unsigned Hyper Integer 高精度整数和无符号高精度整数 hyper, unsigned hyper 64 bits
Floating-point 浮点数 float
Double-Precision Floating-point 双精度浮点数 double
Quadruple-Precision Floating-point 四精度浮点数 quadruple 128 bits
Fixed-Length Opaque Data 固定长度的不透明数据 opaque identifier[n]
Variable-Length Opaque Data 可变长度的不透明数据 opaque identifier<n> 至多前四个字节用于表示长度,之后接数据,故最长 \(2^{32}-1\) bytes
String 字符串 string object<m> 至多前四个字节用于表示长度,之后接数据,故最长 \(2^{32}-1\) bytes
Fixed-Length Array 固定长度的数组 type-name identifier[n] 每个元素类型相同,但长度可以不同,比如 string 作为元素
Variable-Length Array 可变长度的数组 type-name identifier<m> 至多前四个字节用于表示长度,之后接数据,故最长 \(2^{32}-1\) 个元素
Structure 结构体 struct { component-declaration-A; ... }
Discriminated Union 区分联合 union switch (discriminant-declaration) { case discriminant-value-A: arm-declaration-A; ... default: default-declaration; } discriminant 可以是 intunsigned intenum,均为 4 bytes,后接对应的数据
Void void 0 bytes,可以放在 union
Constant 常量 const 不代表数据,只是符号常量
Typedef 类型定义 typedef
Optional Data 可选数据 type-name * “可选”的意思是数据可能不存在,等价于最长长度为 1 的变长数组,常用于递归数据结构(链表的 next 指针)

RFC 第五部分解释了 XDR 中一些设计的原因,比如块大小为四字节是为了内存对齐。

其余部分描述了 BNF 范式下的语法定义和一些范例。