?? rfc3072.txt
字號:
組織:中國互動出版網(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 + -