XDR 全称为 External Data Representation ,是一个描述和编码数据的标准。1987年由Sun公司(Sun Microsystems, Inc)发明。
XDR 同时是一门语言,主要用来描述协议的数据格式,如RPC、NFS等协议就是使用它来描述自身的数据格式。
XDR 语言只能用于描述协议的数据格式,不具有编程功能。该语言具有以下特点:
- 类似于C语言
- 描述复杂的数据格式时,相比图形描述,其更简洁
XDR 语法
分号 ;
在 XDR 语言中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。例如:
int a; int b; 复制代码
保留字
下表列出了 XDR 语言中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
| 关键字 | 说明 |
|---|---|
| int | 声明整型变量 |
| hyper | 声明长整型变量 |
| unsigned | 声明无符号类型变量 |
| float | 声明浮点型变量 |
| double | 声明双精度浮点型变量 |
| enum | 声明枚举类型 |
| bool | 声明布尔类型 |
| opaque | 声明字节流数组类型 |
| string | 声明字符串类型 |
| struct | 声明结构体类型 |
| union | 声明共用体类型 |
| switch | 声明共用体类型和用于开关语句 |
| case | 开关语句分支 |
| typedef | 用以给数据类型取别名 |
| void | 声明空值,声明无返回值或无参数的操作 |
注释
XDR 语言有2种注释方法:
-
使用
//注释// 单行注释 复制代码
-
使用
/* */注释/* 单行注释 */ /* 多行注释 多行注释 ... */ 复制代码
定义变量
定义变量的语法如下:
type-name variable_name = value; 复制代码
XDR 数据类型
XDR 语言提供了多种数据类型来帮助描述协议的数据格式,下面将会一一展开介绍。
整数类型
XDR 语言提供的整数类型有:
| 类型 | 存储大小 |
|---|---|
| int(整型) | 4字节 |
| unsigned int(无符号整型) | 4字节 |
| hyper(长整型) | 8字节 |
| unsigned hyper(无符号长整型) | 8字节 |
各个整数类型定义变量的语法如下:
int a; unsigned int b; hyper c; unsigned hyper d; 复制代码
实例演示:
int a = 10; unsigned hyper d = 10000; 复制代码
浮点数类型
XDR 语言提供的浮点数类型有:
| 类型 | 存储大小 | 精度 |
|---|---|---|
| float(单精度浮点型) | 4字节 | 6 位小数 |
| double(双进度浮点型) | 8字节 | 15 位小数 |
XDR 语言的浮点数类型使用的是IEEE 754标准。
各个浮点数类型定义变量的语法如下:
float a; double b; 复制代码
实例演示:
float a = 1.2; double b = 3.402823E+38; 复制代码
枚举类型
XDR 使用 enum 定义枚举类型,语法如下:
enum identifier { name-identifier = constant, ... } ;
复制代码
注意:枚举成员的值的类型为 int 类型;每个枚举成员的值都是唯一的。
实例演示:通过枚举描述红绿蓝3种颜色
enum color_type {
RED = 1,
GREEN = 2,
BLUE = 3
} ;
color_type color = RED;
复制代码
布尔类型
XDR 使用 bool 定义布尔类型变量,语法如下:
bool identifier; 复制代码
布尔类型只有2个值: FALSE 或者 TRUE 。
实例演示:
bool a = TRUE; 复制代码
Opaque Data 类型
Opaque Data 类型主要用来描述字节流数组,它有2种类型:定长和变长 Opaque Data 类型。
XDR 使用 opaque 声明 Opaque Data 类型。
定长 Opaque Data 类型
定长 Opaque Data 类型定义变量的语法如下:
opaque identifier[n]; 复制代码
其中, n 是一个整数常量,用于声明数组的长度。
如果 n 不是4的倍数,程序应对数组进行补齐操作,即在第 n 个字节后添加 r (r 取值范围为:[0,3])个值为0的字节,使得 (n+r) mod 4 = 0 。
定长 Opaque Data 类型的数据格式如下图所示:
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
复制代码
实例演示:
opaque byteBox[128]; 复制代码
变长 Opaque Data 类型
变长 Opaque Data 类型定义变量的语法如下:
opaque identifier<m>; // or opaque identifier<>; 复制代码
其中, m 是一个整数常量,用于声明数组的最大长度。
若通过第二种方式(不明确声明数组的最大长度)声明定义变量,则数组默认最大长度为: (2^32) - 1 。
如果 m 不是4的倍数,程序应对数组进行补齐操作,即在第 m 个字节后添加 r (r 取值范围为:[0,3])个值为0的字节,使得 (m+r) mod 4 = 0 。
变长 Opaque Data 类型的数据格式如下图所示:
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
复制代码
其中,数组前4个字节声明了数组的真实长度(有效数据长度)。
实例演示:
opaque byteBox<>; 复制代码
字符串类型
字符串类型主要用来描述ASCII字符数组,它是变长数据类型。
XDR 使用 string 定义字符串类型变量,语法如下:
string object<m>; //or string object<>; 复制代码
其中, m 是一个整数常量,用于声明数组的最大长度。
若通过第二种方式(不明确声明数组的最大长度)定义字符串类型变量,则数组默认最大长度为: (2^32) - 1 。
如果 m 不是4的倍数,程序应对数组进行补齐操作,即在第 m 个字节后添加 r (r 取值范围为:[0,3])个值为0的字节,使得 (m+r) mod 4 = 0 。
字符串类型的数据格式如下图所示:
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
复制代码
其中,数组前4个字节声明了数组的真实长度(有效数据长度)。
实例演示:
string asciiBox<>; 复制代码
数组类型
数组类型主要用来描述已知的数据类型的元素数组,它有2种类型:定长和变长数组类型。
在数组中,每个元素的长度都是4的倍数。
数组每个元素的数据类型相同,但是它们的长度却不一定相同,比如字符串数组。
定长数组类型
定长数组类型定义变量的语法如下:
type-name identifier[n]; 复制代码
其中, n 是一个整数常量,用于声明数组的长度。
定长数组类型的数据格式如下图所示:
+---+---+---+---+---+---+---+---+...+---+---+---+---+
| element 0 | element 1 |...| element n-1 |
+---+---+---+---+---+---+---+---+...+---+---+---+---+
|<--------------------n elements------------------->|
FIXED-LENGTH ARRAY
复制代码
实例演示:
string strList[10]; 复制代码
变长数组类型
变长数组类型定义变量的语法如下:
type-name identifier<m>; // or type-name identifier<>; 复制代码
其中, m 是一个整数常量,用于声明数组的最大长度。
若通过第二种方式(不明确声明数组的最大长度)定义变量,则数组默认最大长度为: (2^32) - 1 。
变长数组类型的数据格式如下图所示:
0 1 2 3
+--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+
| n | element 0 | element 1 |...|element n-1|
+--+--+--+--+--+--+--+--+--+--+--+--+...+--+--+--+--+
|<-4 bytes->|<--------------n elements------------->|
COUNTED ARRAY
复制代码
其中,数组前4个字节声明了数组的真实长度(有效数据长度)。
实例演示:
string strList<>; 复制代码
结构体类型
结构体类型主要用于描述自定义的数据对象类型。
XDR 使用 struct 定义结构体类型,语法如下:
struct identifier {
component-declaration-A;
component-declaration-B;
...
};
复制代码
注意:结构体中的成员可以是不同的数据类型,但是成员的长度都应该是4的倍数。
实例演示:
struct msg {
unsigned int id;
string body<>;
};
``
复制代码
共用体类型
共用体类型主要用于描述“根据不同条件返回不同数据类型”的数据类型。
XDR 使用 union switch 定义共用体类型,语法如下:
union switch (discriminant-declaration) {
case discriminant-value-A:
arm-declaration-A;
case discriminant-value-B:
arm-declaration-B;
...
default: default-declaration;
} identifier;
复制代码
注意:每个 case 关键字后面都需要跟着一个合法的判断值。 default 语句是可选的。
实例演示:根据颜色返回字节流数组或者结构体或者空的数据类型。
union switch (color_type color) {
case RED:
opaque results[0];
case BLUE:
struct {
unsigned int hex;
} info;
default:
void;
}
复制代码
Void
XDR 使用 void 代表空。用于描述无值的情况,或者用于描述不接受数据作为输入或不接受数据作为输出的操作。
Constant
XDR 使用 const 为字面量定义一个符号名称,语法如下:
const name-identifier = n; 复制代码
实例演示:在下面的例子中, pi 这个符号常量等同于整数常量3.14159。
const pi = 3.14159; 复制代码
Typedef
XDR 使用 typedef 为已声明的数据类型定义一个新标识符。
需要注意的是,在不同场景下,为已声明的数据类型定义一个新标识符会有不同的语法:
-
为
struct、union、enum数据类型定义新标识符typedef <<struct, union, or enum definition>> identifier; 复制代码
实例演示:例如定义
bool类型。typedef enum { /* using typedef */ FALSE = 0, TRUE = 1 } bool; // or enum bool { /* preferred alternative */ FALSE = 0, TRUE = 1 }; 复制代码 -
为数组类型定义新标识符
typedef type_name identifier[n]; 复制代码
实例演示:定义一个int数组。
typedef int byteBox[1024]; 复制代码
这时候,下面定义
kb变量2种方式都是可以的。byteBox kb; // or int kb[1024]; 复制代码
-
为其他数据数据类型定义新标识符
typedef type_name identifier; 复制代码
实例演示:定义一个
byte类型。typedef int byte; 复制代码
Optional-data 类型
Optional-data 类型用于描述值可能为空( void )的数据类型。它相当于 C 语言中的指针。
Optional-data 类型定义变量的语法如下:
type-name *identifier; 复制代码
使用 XDR 描述协议
下面将会通过一个小案例演示 XDR 是如何描述协议的数据格式的。
下图为以太网协议中“帧”的数据格式:
我们现在使用 XDR 描述进行描述:
struct frame {
opaque d_mac[6];
opaque s_mac[6];
opaque type[2];
opaque data<1500>;
opaque fcs[4];
}
复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Perl语言入门 第六版(中文版)
Randal L.Schwartz、brian d foy、Tom Phoenix / 盛春 / 东南大学出版社 / 2012-3 / 62.00元
《Perl语言入门(第6版)(中文版)》根据作者施瓦茨、福瓦、菲尼克斯从1991年开始的教学经验积累汇聚而成,多年来十分畅销。此次第六版涵盖了最新的Perl5.14版本的变化。《Perl语言入门(第6版)(中文版)》每章都包含若干习题,帮助你巩固消化刚学到的知识。也许其他书籍只是想着灌输Perl编程的条条框框,但《Perl语言入门(第6版)(中文版)》不同,我们希望把你培养成一名真正的Perl程序......一起来看看 《Perl语言入门 第六版(中文版)》 这本书的介绍吧!