?? rfc3072.txt
字號:
組織:中國互動出版網(wǎng)(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)
譯文發(fā)布時間:2001-12-19
版權(quán):本翻譯文檔可以用于非商業(yè)用途自由轉(zhuǎn)載,但必須保留本文檔的翻譯及組織信息。
Network Working Group M. Wildgrube
Request for Comments: 3072 March 2001
Category: Informational
結(jié)構(gòu)化數(shù)據(jù)交換格式
(RFC3072——Structured Data Exchange Format (SDXF))
本備忘錄的狀態(tài)
本備忘錄為Internet社區(qū)提供信息,沒有定義任何類型的標(biāo)準(zhǔn)。被備忘錄的發(fā)布沒有限
制。
版權(quán)信息
Copyright (C) The Internet Society (2001). All Rights Reserved.
IESG說明
本文檔規(guī)定了一種數(shù)據(jù)交換格式,和用于創(chuàng)建于解析這種格式的部分API。IESG認(rèn)為
IETF通常使用的ASN.1和XML格式也可解決同樣的問題。強(qiáng)烈建議本文讀者在放棄ASN.1
或XML改用SDXF之前認(rèn)真閱讀第13部分。另外,如果以SDXF格式保存文本,建議用
戶按照第2.5節(jié)的要求采用UTF-8的數(shù)據(jù)類型。
摘要
本規(guī)范描述的通用交換格式既可用于文件格式,也可用于網(wǎng)絡(luò)。數(shù)據(jù)被組織成數(shù)據(jù)塊,
數(shù)據(jù)塊按照層次結(jié)構(gòu)排列。本格式是自描述的,與硬件無關(guān)。
目錄
1. 簡介 2
2. SDFX數(shù)據(jù)格式規(guī)范 3
2.1 數(shù)據(jù)塊 3
2.2 結(jié)構(gòu)化塊 3
2.3 塊元素內(nèi)部表示的幾點要求: 4
2.4 內(nèi)容部分的字符值同樣也是經(jīng)過改寫的對象,參見第4章。 4
2.5 標(biāo)志位的含義: 4
2.6 短塊 5
2.7 壓縮塊和加密塊 5
2.8 數(shù)組 5
2.9 UTF-8的處理 5
2.10 某些位不能同時出現(xiàn): 5
3. SDFX函數(shù)介紹 5
3.1 一般事項 5
3.2 寫入一個SDXF緩沖區(qū) 6
3.3 從SDXF緩沖區(qū)中讀出,可以使用下列函數(shù): 6
3.4 例子: 6
4. 平臺獨立性 8
5. 壓縮 8
6. 加密 9
7. 數(shù)組 9
8. SDXF函數(shù)描述 10
8.1 簡介 10
8.2 基本定義 10
8.3 C++定義 12
8.4 公共定義: 13
8.5 專用函數(shù) 14
9. 對UTF-8的支持 15
10. 安全問題 16
11. 幾點提示 16
12. 關(guān)于IANA 16
12.1 壓縮方法 17
12.2 加密方法 17
12.3 關(guān)于方法編號的分配 17
13. 討論 17
13.1 SDXF與ASN.1 17
13.2 SDXF 與XML 18
14. 作者地址 19
15. 鳴謝 19
16. 參考 19
17. 版權(quán)聲明 20
1. 簡介
結(jié)構(gòu)化數(shù)據(jù)交換格式(Structured Data eXchange Format)的目的是實現(xiàn)各種不同類型數(shù)
據(jù)(數(shù)字、文本、位串)組成的任意結(jié)構(gòu)化數(shù)據(jù)塊的交換。由于數(shù)據(jù)被規(guī)格化為一種獨立于
“網(wǎng)絡(luò)格式”的抽象計算機(jī)體系結(jié)構(gòu),因此SDXF可作為網(wǎng)絡(luò)交換數(shù)據(jù)格式使用。
本數(shù)據(jù)格式可用于任何應(yīng)用程序,在設(shè)計本格式時,目的就是使它既可以作為文字處理
程序的文本格式,也可以作為圖象、聲音文件格式,還可以是帶有復(fù)雜參數(shù)的遠(yuǎn)程過程調(diào)用,
同樣也適用于文檔格式和商業(yè)數(shù)據(jù)交換等等。
SDXF是自描述的,任何程序無需了解每個數(shù)據(jù)元素的含義就可以解析出任何SDXF數(shù)
據(jù)。
在描述數(shù)據(jù)格式的同時,本文還將介紹一些函數(shù),通過這些函數(shù)可以創(chuàng)建和訪問SDXF
格式的數(shù)據(jù)。這樣做是希望讓程序員不需要處理底層的數(shù)據(jù)結(jié)構(gòu),只要簡單地使用這些函數(shù)
就可以了。(用面向?qū)ο缶幊痰男g(shù)語來講,這些函數(shù)就是作為給定SDXF數(shù)據(jù)塊句柄的某個
對象的方法。)
SDFX沒有規(guī)定特定的平臺,由于SDFX函數(shù)的精心設(shè)計,SDFX數(shù)據(jù)可以跨越不同的
體系結(jié)構(gòu)進(jìn)行交換(具體就字符編碼而言,如ASCII、ANSI、EBCDIC以及二進(jìn)制數(shù)據(jù)的
字節(jié)流)。也可以對SDXF數(shù)據(jù)整塊或部分進(jìn)行壓縮或加密。
2. SDFX數(shù)據(jù)格式規(guī)范
2.1 數(shù)據(jù)塊
首先介紹數(shù)據(jù)塊的概念,塊是由一組固定成分組成的數(shù)據(jù)結(jié)構(gòu),塊可以是“原子性”的
也可以是“結(jié)構(gòu)性”的,結(jié)構(gòu)塊內(nèi)部還可以包含其它的塊。
塊由頭部和數(shù)據(jù)體(內(nèi)容)組成:
名稱
位置
長度
說明
塊ID
1
2
數(shù)據(jù)塊的ID號,無符號整數(shù)
Flags
3
1
塊的類型和屬性
長度length
4
3
后續(xù)數(shù)據(jù)的長度
內(nèi)容content
7
*
純數(shù)據(jù)或塊列表
內(nèi)容的長度由頭部字段length指定,整個塊的長度為length+6。塊ID號是一個正整數(shù)。
其存儲的格式如下:
+----+----+----+----+----+----+----+----+----+-...
| 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 結(jié)構(gòu)化塊
結(jié)構(gòu)化塊由標(biāo)志字節(jié)指明(參見2.5節(jié))。與原子塊不同的是,結(jié)構(gòu)化塊的內(nèi)容部分包
含一個塊列表(可以是原子塊或者結(jié)構(gòu)塊)。
+----+-+---+-------+-------+-------+-----+-------+
| id |f|len| chunk | chunk | chunk | ... | chunk |
+----+-+---+-------+-------+-------+-----+-------+
根據(jù)這個概念,可以在SDXF塊內(nèi)構(gòu)造任何層次化的結(jié)構(gòu)數(shù)據(jù)。
2.3 塊元素內(nèi)部表示的幾點要求:
類似于IP頭部的二進(jìn)制值,塊中的二進(jìn)制數(shù)據(jù)也采用高位在前的順序(big endian)。
比方說某個塊的內(nèi)容長為300(=256+32+12),其存儲格式用十六進(jìn)制表示為:
+----+----+----+----+----+----+----+----+----+--
| | | 00 01 2C | content
+----+----+----+----+----+----+----+----+----+--
這一規(guī)定同樣適用于塊ID。
2.4 內(nèi)容部分的字符值同樣也是經(jīng)過改寫的對象,參見第4章。
2.5 標(biāo)志位的含義:
+-+-+-+-+-+-+-+-+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
| | | | | | | |
| | | | | | | +-- 保留
| | | | | | +---- 數(shù)組
| | | | | +------ 短塊
| | | | +-------- 加密塊
| | | +---------- 壓縮塊
| | |
+-+-+------------ 數(shù)據(jù)類型(0..7)
數(shù)據(jù)類型為:
0 – 不定數(shù)據(jù) (塊格式不正確,,參見11.1)
1 – 結(jié)構(gòu)
2 – 位串
3 – 數(shù)字
4 – 字符
5 – 浮點數(shù) (ANSI/IEEE 754-1985)
6 -- UTF-8
7 – 保留
2.6 短塊
不含數(shù)據(jù)體的塊稱為短塊,3個字節(jié)的長度字段用來表示數(shù)據(jù)類型,這樣做是為了在使
用大量短塊時節(jié)省空間。
2.7 壓縮塊和加密塊
參見第5章和第6章。
2.8 數(shù)組
參見第7章
2.9 UTF-8的處理
參見第9章。
2.10 某些位不能同時出現(xiàn):
- “數(shù)組”和“短塊”標(biāo)識不能同時出現(xiàn)
- “短塊”標(biāo)志不能用于“結(jié)構(gòu)”和“浮點”數(shù)據(jù)類型
- “數(shù)組”標(biāo)志不能用于“結(jié)構(gòu)”數(shù)據(jù)類型
3. SDFX函數(shù)介紹
3.1 一般事項
SDFX的函數(shù)概念不依賴于特定的編程語言,但函數(shù)本身必須用某種程序語言實現(xiàn)。這
里使用C和C++討論這些函數(shù),因為目前這些語言可在多數(shù)平臺上使用。 這些讀寫SDXF
數(shù)據(jù)塊的函數(shù)只含一個參數(shù)結(jié)構(gòu)。在C++中,這一參數(shù)結(jié)構(gòu)是“SDXF”類的一部分,SDXF
函數(shù)都是這個類的方法。關(guān)于這一接口的詳細(xì)描述參見第8章。
3.2 寫入一個SDXF緩沖區(qū)
要寫入一個SDXF塊,可以使用下述函數(shù):
init -- 初始化參數(shù)塊
create -- 創(chuàng)建新塊
leave -- “關(guān)閉”結(jié)構(gòu)化塊
3.3 從SDXF緩沖區(qū)中讀出,可以使用下列函數(shù):
init -- 初始化參數(shù)塊
enter -- “進(jìn)入”一個結(jié)構(gòu)化塊
next -- “移動”達(dá)奧一個結(jié)構(gòu)化塊內(nèi)的下一個塊
extract – 把原子塊的內(nèi)容讀取到用戶數(shù)據(jù)區(qū)
leave -- “離開”某個結(jié)構(gòu)塊
3.4 例子:
3.4.1 寫:
為了說明方便,我們采用這些具有多態(tài)定義的函數(shù)的簡化的C++形式:
void create (short chunkID); // 打開一個新的結(jié)構(gòu),
void create (short chunkID, char *string); //創(chuàng)建一個字符數(shù)據(jù)類型的新塊
下述語句:
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
創(chuàng)建了一個如下所示的塊:
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數(shù)據(jù)塊的訪問通常是在一個循環(huán)內(nèi)完成的:
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:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -