⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfc3072.txt

📁 很多RFC的中文文档
💻 TXT
📖 第 1 页 / 共 3 页
字号:
组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
译者:王安鹏(anpengwang    anpengwang@263.net)
译文发布时间:2001-12-19
版权:本翻译文档可以用于非商业用途自由转载,但必须保留本文档的翻译及组织信息。

Network Working Group                                       M. Wildgrube
Request for Comments: 3072                                    March 2001
Category: Informational

结构化数据交换格式
(RFC3072——Structured Data Exchange Format (SDXF))

本备忘录的状态
本备忘录为Internet社区提供信息,没有定义任何类型的标准。被备忘录的发布没有限
制。
版权信息
  Copyright (C) The Internet Society (2001).  All Rights Reserved.

IESG说明
本文档规定了一种数据交换格式,和用于创建于解析这种格式的部分API。IESG认为
IETF通常使用的ASN.1和XML格式也可解决同样的问题。强烈建议本文读者在放弃ASN.1
或XML改用SDXF之前认真阅读第13部分。另外,如果以SDXF格式保存文本,建议用
户按照第2.5节的要求采用UTF-8的数据类型。

摘要
本规范描述的通用交换格式既可用于文件格式,也可用于网络。数据被组织成数据块,
数据块按照层次结构排列。本格式是自描述的,与硬件无关。

目录
1. 简介	2
2. SDFX数据格式规范	3
2.1 数据块	3
2.2 结构化块	3
2.3 块元素内部表示的几点要求:	4
2.4 内容部分的字符值同样也是经过改写的对象,参见第4章。	4
2.5 标志位的含义:	4
2.6 短块	5
2.7 压缩块和加密块	5
2.8 数组	5
2.9 UTF-8的处理	5
2.10 某些位不能同时出现:	5
3. SDFX函数介绍	5
3.1 一般事项	5
3.2 写入一个SDXF缓冲区	6
3.3 从SDXF缓冲区中读出,可以使用下列函数:	6
3.4 例子:	6
4. 平台独立性	8
5. 压缩	8
6. 加密	9
7. 数组	9
8. SDXF函数描述	10
8.1 简介	10
8.2 基本定义	10
8.3 C++定义	12
8.4 公共定义:	13
8.5 专用函数	14
9. 对UTF-8的支持	15
10. 安全问题	16
11. 几点提示	16
12. 关于IANA	16
12.1 压缩方法	17
12.2 加密方法	17
12.3 关于方法编号的分配	17
13. 讨论	17
13.1 SDXF与ASN.1	17
13.2 SDXF 与XML	18
14. 作者地址	19
15. 鸣谢	19
16. 参考	19
17.  版权声明	20

1. 简介
结构化数据交换格式(Structured Data eXchange Format)的目的是实现各种不同类型数
据(数字、文本、位串)组成的任意结构化数据块的交换。由于数据被规格化为一种独立于
“网络格式”的抽象计算机体系结构,因此SDXF可作为网络交换数据格式使用。
本数据格式可用于任何应用程序,在设计本格式时,目的就是使它既可以作为文字处理
程序的文本格式,也可以作为图象、声音文件格式,还可以是带有复杂参数的远程过程调用,
同样也适用于文档格式和商业数据交换等等。
SDXF是自描述的,任何程序无需了解每个数据元素的含义就可以解析出任何SDXF数
据。
在描述数据格式的同时,本文还将介绍一些函数,通过这些函数可以创建和访问SDXF
格式的数据。这样做是希望让程序员不需要处理底层的数据结构,只要简单地使用这些函数
就可以了。(用面向对象编程的术语来讲,这些函数就是作为给定SDXF数据块句柄的某个
对象的方法。)
SDFX没有规定特定的平台,由于SDFX函数的精心设计,SDFX数据可以跨越不同的
体系结构进行交换(具体就字符编码而言,如ASCII、ANSI、EBCDIC以及二进制数据的
字节流)。也可以对SDXF数据整块或部分进行压缩或加密。

2. SDFX数据格式规范
2.1 数据块
首先介绍数据块的概念,块是由一组固定成分组成的数据结构,块可以是“原子性”的
也可以是“结构性”的,结构块内部还可以包含其它的块。
块由头部和数据体(内容)组成:
名称
位置
长度
说明
块ID
1
2
数据块的ID号,无符号整数
Flags
3
1
块的类型和属性
长度length
4
3
后续数据的长度
内容content
7
*
纯数据或块列表
内容的长度由头部字段length指定,整个块的长度为length+6。块ID号是一个正整数。
其存储的格式如下:
   +----+----+----+----+----+----+----+----+----+-...
   | chunkID | fl | length       |  content
   +----+----+----+----+----+----+----+----+----+-...
用ASN.1语法描述如下:

   chunk  ::=  SEQUENCE
   {
     chunkID INTEGER (1..65535),
     flags   BIT STRING,
     length  OCTET STRING SIZE 3, -- or: INTEGER (0..16777215)
     content OCTET STRING
   }

2.2 结构化块
结构化块由标志字节指明(参见2.5节)。与原子块不同的是,结构化块的内容部分包
含一个块列表(可以是原子块或者结构块)。
   +----+-+---+-------+-------+-------+-----+-------+
   | id |f|len| chunk | chunk | chunk | ... | chunk |
   +----+-+---+-------+-------+-------+-----+-------+
根据这个概念,可以在SDXF块内构造任何层次化的结构数据。

2.3 块元素内部表示的几点要求:
类似于IP头部的二进制值,块中的二进制数据也采用高位在前的顺序(big endian)。
比方说某个块的内容长为300(=256+32+12),其存储格式用十六进制表示为:
   +----+----+----+----+----+----+----+----+----+--
   |         |    | 00   01   2C |  content
   +----+----+----+----+----+----+----+----+----+--
这一规定同样适用于块ID。

2.4 内容部分的字符值同样也是经过改写的对象,参见第4章。
2.5 标志位的含义:
     +-+-+-+-+-+-+-+-+
     |0|1|2|3|4|5|6|7|
     +-+-+-+-+-+-+-+-+
      | | | | | | | |
      | | | | | | | +-- 保留
      | | | | | | +---- 数组
      | | | | | +------ 短块
      | | | | +-------- 加密块
      | | | +---------- 压缩块
      | | |
      +-+-+------------ 数据类型(0..7)
数据类型为:
   0 – 不定数据 (块格式不正确,,参见11.1)
   1 – 结构
   2 – 位串
   3 – 数字
   4 – 字符
   5 – 浮点数 (ANSI/IEEE 754-1985)
   6 -- UTF-8
   7 – 保留

2.6 短块
不含数据体的块称为短块,3个字节的长度字段用来表示数据类型,这样做是为了在使
用大量短块时节省空间。
2.7 压缩块和加密块
参见第5章和第6章。
2.8 数组
参见第7章
2.9 UTF-8的处理
参见第9章。
2.10 某些位不能同时出现:
   -  “数组”和“短块”标识不能同时出现
   -  “短块”标志不能用于“结构”和“浮点”数据类型
-	“数组”标志不能用于“结构”数据类型

3. SDFX函数介绍

3.1 一般事项
SDFX的函数概念不依赖于特定的编程语言,但函数本身必须用某种程序语言实现。这
里使用C和C++讨论这些函数,因为目前这些语言可在多数平台上使用。 这些读写SDXF
数据块的函数只含一个参数结构。在C++中,这一参数结构是“SDXF”类的一部分,SDXF
函数都是这个类的方法。关于这一接口的详细描述参见第8章。

3.2 写入一个SDXF缓冲区
要写入一个SDXF块,可以使用下述函数:
   init    -- 初始化参数块
   create  -- 创建新块
   leave   -- “关闭”结构化块

3.3 从SDXF缓冲区中读出,可以使用下列函数:
   init    -- 初始化参数块
   enter   -- “进入”一个结构化块
   next    -- “移动”达奥一个结构化块内的下一个块
   extract – 把原子块的内容读取到用户数据区
   leave   -- “离开”某个结构块

3.4 例子:

3.4.1 写:
为了说明方便,我们采用这些具有多态定义的函数的简化的C++形式:
   void create (short chunkID); // 打开一个新的结构,
   void create (short chunkID, char *string);  //创建一个字符数据类型的新块
下述语句:
   SDXF x(new); // create the SDXF object "x" for a new chunk
                // includes the "init"
   x.create (3301);   // opens a new structure
   x.create (3302, "first chunk");
   x.create (3303, "second chunk");
   x.create (3304);   // opens a new structure
   x.create (3305, "chunk in a structure");
   x.create (3306, "next chunk in a structure");
   x.leave ();        // closes the inner structure
   x.create (3307, "third chunk");
   x.leave ();        // closes the outer structure
创建了一个如下所示的块:
   3301
    |
    +--- 3302 = "first chunk"
    |
    +--- 3303 = "second chunk"
    |
    +--- 3304
    |      |
    |      +--- 3305 = "chunk in a structure"
    |      |
    |      +--- 3306 = "next chunk in a structure"
    |
    +--- 3307 = "last chunk"

3.4.2读
对SDXF数据块的访问通常是在一个循环内完成的:
   SDXF x(old); // defines a SDXF object "x" for an old chunk
   x.enter ();  // enters the structure

   while (x.rc == 0) // 0 == ok, rc will set by the SDXF functions
   {
     switch (x.chunkID)
     {
       case 3302:
         x.extract (data1, maxLength1);
                   // extr. 1st chunk into data1
         break;

       case 3303:
         x.extract (data2, maxLength2);
                   // extr. 2nd chunk into data2
         break;

       case 3304:  // we know this is a structure
         x.enter (); // enters the inner structure

         while (x.rc == 0) // inner loop
         {
           switch (x.chunkID)
           {
             case 3305:
               x.extract (data3, maxLength3);
                         // extr. the chunk inside struct.

               break;
             case 3306:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -