FAST 1.1規(guī)范中文版全文參考_第1頁(yè)
FAST 1.1規(guī)范中文版全文參考_第2頁(yè)
FAST 1.1規(guī)范中文版全文參考_第3頁(yè)
FAST 1.1規(guī)范中文版全文參考_第4頁(yè)
FAST 1.1規(guī)范中文版全文參考_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1. fast 1.1 規(guī)范中文版全文參考fast sm規(guī)范版本 1.x.12006-12-201) 導(dǎo)言本文定義了fast的結(jié)構(gòu)和語(yǔ)法。fast是一種面向消息數(shù)據(jù)流的二進(jìn)制編碼方法。fast是fix adapted for streaming.的縮寫(適流fix)。雖然fast提出的初衷是為了對(duì)fix消息進(jìn)行優(yōu)化,但本文中定義的編碼方式已經(jīng)被推廣應(yīng)用到更廣泛的協(xié)議集。fast編碼方法在兩個(gè)層面上降低數(shù)據(jù)流的大小。首先,通過“域操作符”的概念使得可以利用流中數(shù)據(jù)的相關(guān)性,消除冗余數(shù)據(jù)。其次,在二進(jìn)制編碼對(duì)余下數(shù)據(jù)的串行化中利用了可自描述的域長(zhǎng)度以及指示域是否存在的位圖。編碼依據(jù)稱為“模版”的控

2、制結(jié)構(gòu)來(lái)進(jìn)行。模版通過規(guī)定域的順序和結(jié)構(gòu)、域操作符,及其使用的二進(jìn)制編碼表示方法來(lái)控制對(duì)流的一部分的編碼。本規(guī)范對(duì)模版定義(template definition, td)結(jié)構(gòu)的具體語(yǔ)法(concrete syntax)進(jìn)行了定義。具體語(yǔ)法的引入是為了能提供一個(gè)人機(jī)可讀、正規(guī)化、和全真的格式,它被作為默認(rèn)格式,用來(lái)制作、存儲(chǔ)和交換fast模版。但是,本規(guī)范的具體語(yǔ)法不是為了用于在fast會(huì)話的兩端間在線交換模版定義結(jié)構(gòu)。對(duì)于在線傳送,fast會(huì)話控制協(xié)議 scp提供了對(duì)本文所定義的模版結(jié)構(gòu)的fast串行化方法。本文使用模式(schema)語(yǔ)言將具體語(yǔ)法正式定義為一個(gè)xml的結(jié)構(gòu)。處理器(pro

3、cessor)(編碼器或解碼器)并不要求必須使用上述的具體語(yǔ)法。例如,處理器可以使用scp協(xié)議讀取編碼為fast消息的模版定義,或者也可將它們硬編碼在程序中。處理器通常需要對(duì)一個(gè)模版集合進(jìn)行管理。盡管具體語(yǔ)法提供了在一個(gè)xml文檔中定義單個(gè)或多個(gè)模版的方法,但本規(guī)范并不對(duì)一般情況下如何構(gòu)建或維護(hù)模版集合或模版數(shù)據(jù)庫(kù)作出規(guī)定。對(duì)于特定處理器所使用的特定模版,甚至可以同時(shí)使用多個(gè)源(譬如xml文檔及scp)來(lái)進(jìn)行定義。下面的xml片段是采用具體語(yǔ)法格式的一個(gè)模版定義的例子。 第 2 頁(yè) 共 37 頁(yè)附錄3包含更多的具體語(yǔ)法及其相應(yīng)域的編碼的范例。2) 術(shù)語(yǔ)術(shù)語(yǔ)編碼(encode)是指將一個(gè)應(yīng)用類型

4、的實(shí)例串行化(serialize)為fast流的過程。術(shù)語(yǔ)解碼(decode)是指將fast流的一部分的反串行化(deserialize)為一個(gè)應(yīng)用類型實(shí)例的過程。鑒于在對(duì)編碼操進(jìn)行定義后,解碼已較簡(jiǎn)單,因此,本文并不一定對(duì)一個(gè)解碼操作再作明確地描述。本文根據(jù)是否屬于處理模型的內(nèi)容來(lái)定義fast流的編解碼。但該處理模型被看作是一個(gè)抽象的模型,只要能獲得與使用本模型一樣的結(jié)果,可以采用任意的方法來(lái)具體實(shí)現(xiàn)fast編解碼。3) 標(biāo)記法本文使用relax ng模式語(yǔ)言rnc的緊湊語(yǔ)法來(lái)正式定義用于模板定義的xml結(jié)構(gòu),在模式的片段中穿插了相應(yīng)的描述性文字。附錄1給出了完整的、可擴(kuò)展的模式。文字中的模

5、式片段并沒有包含與可擴(kuò)展性相關(guān)的部分。附錄2給出了w3c xml 模式xsd的對(duì)應(yīng)版本。錯(cuò)誤由帶方框的錯(cuò)誤標(biāo)識(shí)符來(lái)標(biāo)記。參考文獻(xiàn)由帶方框的、“參考文獻(xiàn)”小節(jié)中的對(duì)應(yīng)標(biāo)識(shí)符來(lái)標(biāo)記。3.1) xml命名空間模板定義結(jié)構(gòu)命名空間(namespace)的uri為“http:/www.fix/ns/fast/td/1.1”. 本文中使用前綴td:對(duì)該命名空間中的元素進(jìn)行引用.default namespace = http:/www.fix/ns/fast/td/1.14) 錯(cuò)誤處理對(duì)模板定義進(jìn)行檢驗(yàn)所發(fā)現(xiàn)的錯(cuò)誤稱為靜態(tài)錯(cuò)誤(static error)。編

6、碼器和解碼器必須對(duì)靜態(tài)錯(cuò)誤進(jìn)行捕獲,并將發(fā)生該類錯(cuò)誤的模板丟棄。當(dāng)從xml文檔中讀取模板定義時(shí),若該文檔出現(xiàn)以下情況則為一個(gè)靜態(tài)錯(cuò)誤errs1:z 不是正確的xml定義格式,z 不符合xml命名空間 xmlns中的約束,z 不符合附錄1中規(guī)定的模式。對(duì)fast流進(jìn)行編碼或解碼時(shí)檢測(cè)到的錯(cuò)誤分為兩種,一種為動(dòng)態(tài)錯(cuò)誤(dynamic error),一種為可報(bào)告錯(cuò)誤(reportable error)。編碼器和解碼器必須對(duì)動(dòng)態(tài)錯(cuò)誤進(jìn)行捕獲。雖然對(duì)可報(bào)告錯(cuò)誤的捕獲是可選的,但也建議對(duì)可報(bào)告錯(cuò)誤進(jìn)行捕獲。通常來(lái)說(shuō),不對(duì)可報(bào)告錯(cuò)誤進(jìn)行捕獲的一個(gè)原因,是希望能獲得更好的性能。但是,為了保證互操作性,建議在開

7、發(fā)及對(duì)實(shí)現(xiàn)的測(cè)試階段對(duì)所有的錯(cuò)誤都進(jìn)行捕獲。第 3 頁(yè) 共 37 頁(yè)5) 應(yīng)用類型應(yīng)用類型(application type)表示使用fast協(xié)議的應(yīng)用層的分組或消息的類型。本文并不規(guī)定應(yīng)用類型的結(jié)構(gòu),并將其看成是抽象的實(shí)體,但是認(rèn)為它們能被映射為以下的模型:z 分組(group)是包含一個(gè)無(wú)序的域的集合的命名類型。z 域(field)具有名稱和類型。其名稱在一個(gè)分組內(nèi)唯一。其類型可以為元類型、序列類型、或者分組類型中的一種。z 序列(sequence)包括長(zhǎng)度及一個(gè)元素的有序集合。其中,每一元素均為分組類型。本規(guī)范并不要求其所有元素的分組類型均相同。這可能會(huì)造成在應(yīng)用層面上異構(gòu)的序列。但在f

8、ast的一個(gè)特定應(yīng)用中可以就此進(jìn)行約束,要求所有的元素都具有相同的類型。z 元類型(primitive type)為ascii碼字符串,unicode字符串,32位無(wú)符號(hào)整數(shù) (uint32), 32位整數(shù)(int32), 64位無(wú)符號(hào)整數(shù)(uint64), 64位整數(shù)(int64), 十進(jìn)制數(shù)和字節(jié)向量,其值域分別與本文中定義的相對(duì)應(yīng)的類型相同。z 流的頂層所出現(xiàn)的分組也被稱為消息(message)。6) 模版模板(template)規(guī)定了如何對(duì)應(yīng)用類型的一個(gè)實(shí)例(也即字節(jié)流的一部分)進(jìn)行編碼。模板用名稱來(lái)進(jìn)行標(biāo)識(shí),其中名稱用于對(duì)另一模板或外部上下文所定義的模板進(jìn)行引用。模板本身不構(gòu)成類型,

9、但通過引用與應(yīng)用類型關(guān)聯(lián)。一個(gè)應(yīng)用類型可對(duì)應(yīng)一個(gè)或多個(gè)模板1。也可創(chuàng)建一個(gè)可用于一個(gè)或多個(gè)應(yīng)用類型的模板。在具體語(yǔ)法中,模板由“”元素定義。一個(gè)模板定義的xml文檔可以包含單個(gè)的模板或多個(gè)模板的集合。模板集合必須封裝在元素中,該元素可包含應(yīng)用于整個(gè)封裝的模板集合的命名空間參數(shù)。模板包含一個(gè)指令(instruction)的序列。其中,指令的順序很重要,應(yīng)與數(shù)據(jù)在流中的位置相對(duì)應(yīng)。指令分為以下兩大類:域指令和模板引用指令(template reference instruction)。域指令規(guī)定了如何將域的實(shí)例編碼成為流。模板引用指令則提供了通過引用其他模板來(lái)定義模板的一個(gè)部分的方法。start

10、= templates | templatetemplates = element templates nsattr?, templatensattr?, dictionaryattr?, template* template = element template templatensname, nsattr?, dictionaryattr?, typeref?, instruction* instruction = field | templateref6.1) 指令上下文編解碼在指令的上下文(instruction context)中進(jìn)行,其中包括:z 模板的集合z 當(dāng)前模板(curre

11、nt template)z 應(yīng)用類型的集合1 讓同一應(yīng)用類型對(duì)應(yīng)多個(gè)模板,使得可針對(duì)該類型的不同使用情況進(jìn)行優(yōu)化。例如,許多 fix 消息都包含了大量各類的域,但只有少數(shù)是被組合使用的。與使用一個(gè)帶有大量可選成分的模板相比,對(duì)每一主要的域的組合選擇使用不同的模板是一種更為簡(jiǎn)煉的方法。第 4 頁(yè) 共 37 頁(yè)z 當(dāng)前應(yīng)用類型(current application type)z 字典(dictionary)的集合z 可選的初值(initial value)當(dāng)前應(yīng)用類型在初始時(shí)為特殊的類型“任意(any)”。當(dāng)處理器碰到包含“”的元素時(shí)當(dāng)前類型改變。新類型適用于該元素所包含的指令?!啊笨稍凇啊薄ⅰ?/p>

12、”和“” 元素中出現(xiàn)。typeref = element typeref nameattr, nsattr?當(dāng)前模板指正被處理的模板,在流中遇到一個(gè)模板標(biāo)識(shí)符時(shí)當(dāng)前模版被更新。如“模板引用指令”小節(jié)中所述的,一個(gè)靜態(tài)模板引用也可改變當(dāng)前模板。字典集合和初值在后文的“操作符”小節(jié)中進(jìn)行描述。6.2) 域指令每一域指令(field instruction)均具有名稱和類型。名稱標(biāo)識(shí)了當(dāng)前應(yīng)用類型中對(duì)應(yīng)的域。類型則規(guī)定了域的基本編碼方法。如果指令的類型不能轉(zhuǎn)換為相應(yīng)的應(yīng)用域的類型,或解碼時(shí)不能由相應(yīng)的應(yīng)用域的類型轉(zhuǎn)換而得到,則產(chǎn)生動(dòng)態(tài)錯(cuò)誤err d1 。可選的“存在(presence)”參數(shù)指示域是

13、一個(gè)必要(mandatory)域,還是一個(gè)可選(optional)域。如果該參數(shù)未被指定,則域?yàn)楸匾?。基本域,也即除了分組或序列之外的域,可具有一個(gè)域操作符,該操作符規(guī)定了對(duì)域的某個(gè)優(yōu)化操作。field = integerfield | decimalfield | asciistringfield | unicodestringfield | bytevectorfield | sequence | groupfieldinstrcontent = nsname, presenceattr?, fieldop? presenceattr = attribute presence manda

14、tory | optional 6.2.1) 整數(shù)域指令整數(shù)(integer)在傳送編碼中的大小不受限。但在通常情況下,應(yīng)用層會(huì)采用固定長(zhǎng)度的整數(shù)。整數(shù)域指令因此必須對(duì)整數(shù)的邊界進(jìn)行指定。元素名稱中的數(shù)字則指示了整數(shù)域指令的位元大小。值的編碼和解碼方法不受整數(shù)大小的影響。前綴“int”表示域是帶符號(hào)的,“uint”則表示域是無(wú)符號(hào)的。integerfield =element int32 fieldinstrcontent | element uint32 fieldinstrcontent | element int64 fieldinstrcontent | element uint64

15、fieldinstrcontent 如果流中的整數(shù)大于特定類型的最大值,或小于指定類型的最小值,則動(dòng)態(tài)錯(cuò)誤 err d2發(fā)生。下表列出了各整數(shù)類型的最大和最小值。類型最小值最大值int32-21474836482147483647uint3204294967295int64-92233720368547758089223372036854775807uint640184467440737095516156.2.2) 十進(jìn)制數(shù)域指令第 5 頁(yè) 共 37 頁(yè)十進(jìn)制數(shù)域指令(decimal field instruction)由兩部分表示:指數(shù)(exponent)部分及尾數(shù)(mantissa)部分。

16、該指令可包含用于整個(gè)十進(jìn)制數(shù)的單個(gè)域操作符,或兩部分各自使用的兩個(gè)操作符。如果為尾數(shù)和/或指數(shù)單獨(dú)指定了操作符,則在結(jié)合成十進(jìn)制數(shù)型數(shù)之前,操作符被單獨(dú)應(yīng)用到每一部分。指數(shù)和尾數(shù)域操作符的操作數(shù)為帶符號(hào)整數(shù),分別為int32和int64類型。如果沒有為整個(gè)十進(jìn)制數(shù)指定操作符,或只指定了單個(gè)操作符,則操作數(shù)為一個(gè)十進(jìn)制數(shù),在傳送編碼中由一個(gè)帶比例數(shù)(scaled number)表示。雖然指數(shù)被看作int32類型,但其允許的值域范圍是-63,63。在應(yīng)用任何操作符后,如果獲得的指數(shù)超出了該范圍,則一個(gè)可報(bào)告錯(cuò)誤err r1產(chǎn)生。當(dāng)單獨(dú)應(yīng)用操作符時(shí),為指數(shù)和尾數(shù)部分生成的名稱是該十進(jìn)制數(shù)域的名稱所特

17、有的,它們將被用作相應(yīng)操作符的關(guān)鍵字的缺省值。如果十進(jìn)制數(shù)域是可選存在的,并具有單獨(dú)的操作符,則尾數(shù)存在與否取決于指數(shù)是否存在。具體規(guī)定請(qǐng)參見“存在圖和空值使用”小節(jié)。當(dāng)使用單獨(dú)的操作符時(shí),可以對(duì)十進(jìn)制數(shù)的范圍和精度進(jìn)行限制。例如,若用于指數(shù)的常量操作符采用常量值2,則就不能將為0.01編碼到該域。如果由于使用某個(gè)操作符引入了限制,造成值不能被編碼到該域,則動(dòng)態(tài)錯(cuò)誤err d3發(fā)生。為十進(jìn)制數(shù)域指令指定的初值將被正規(guī)化。這將在下文的“初值”小節(jié)中進(jìn)行描述。decimalfield = element decimal nsname, presenceattr?, ( fieldop | decf

18、ieldop ) decfieldop = element exponent fieldop ?, element mantissa fieldop ?6.2.3) 字符串域指令字符串域指令(string field instruction)具有指示字符串所使用字符集的、可選的一個(gè)“字符集(charset)”參數(shù)。支持的兩種字符集為:ascii和unicode,分別由參數(shù)值“ascii”和 “unicode”表示。如果沒有指定該參數(shù),則字符集為ascii。根據(jù)指定的字符集,傳送編碼中字符串可由ascii字符串或unicode字符串表示。如果字符串為unicode格式,可對(duì)可選的”元素進(jìn)行指定,

19、以將基礎(chǔ)字節(jié)向量的長(zhǎng)度前導(dǎo)(length preamble)和一個(gè)名稱關(guān)聯(lián)。asciistringfield = element string fieldinstrcontent, attribute charset ascii ? unicodestringfield = element string bytevectorlength?, fieldinstrcontent, attribute charset unicode 6.2.4) 字節(jié)向量域指令字節(jié)向量域指令(byte vector field instruction)表示域在傳送編碼中由一個(gè)字節(jié)向量表示。在具體語(yǔ)法中,可以通過指

20、定“ ”元素將字節(jié)向量的長(zhǎng)度前導(dǎo)和某個(gè)名稱關(guān)聯(lián)。邏輯上,該域是uint32類型的。“ ”的使用不會(huì)影響字節(jié)向量在流中的編碼方式,而只是作為處理器向應(yīng)用層報(bào)告長(zhǎng)度的一個(gè)句柄。bytevectorfield = element bytevector bytevectorlength?, fieldinstrcontent bytevectorlength = element length nsname 6.2.5) 序列域指令序列域指令(sequence field instruction)指示應(yīng)用類型的域?yàn)樾蛄蓄愋?,?yīng)該對(duì)其包括的指令分組重復(fù)使用以對(duì)其每一元素進(jìn)行編碼。如果該分組中的任一指令需要

21、在存在圖中占用一個(gè)位元,則在傳送編碼中每一元素由一個(gè)段(segment)表示。序列具有一個(gè)關(guān)聯(lián)的長(zhǎng)度域,其包含一個(gè)無(wú)符號(hào)整數(shù),用以表示編碼元素的個(gè)數(shù)。若流中出現(xiàn)長(zhǎng)度域,則必須緊接在編碼元素的前面出現(xiàn)。該長(zhǎng)度域具有名稱,類型為uint32,且可具有域操作符。其命名方式有以下兩種:第 6 頁(yè) 共 37 頁(yè)z 隱式方式(implicit):名稱自動(dòng)生成,并特定于序列域的名稱。該名稱不能與模板中顯式指定的域名沖突。z 顯式方式(explicit):名稱在模板定義中顯式地指定。序列可為必要(mandatory)或者可選的(optional)。若序列為可選的,則其長(zhǎng)度域也是可選的。在具體語(yǔ)法中,序列指令由

22、“”表示??稍谌我恢噶钋?,可選地包含一個(gè)“”子元素。該元素規(guī)定了長(zhǎng)度域的屬性。如果該元素具有“名稱(name)”參數(shù)的話,則為顯式命名方式,否則為隱式命名方式。如果沒有指定元素,則長(zhǎng)度域?yàn)殡[式命名,且無(wú)域操作符。sequence = element sequence nsname, presenceattr?, dictionaryattr?, typeref?, length?, instruction* length = element length nsname?, fieldop? 6.2.6) 分組域指令分組域指令(group field instruction)將一個(gè)指令的分組和某

23、個(gè)名稱及存在參數(shù)相關(guān)聯(lián)。如果分組中的任一指令需要在存在圖(presence map, 或pmap)中占用一個(gè)位元,則在傳送編碼中該分組由一個(gè)段表示。當(dāng)前應(yīng)用類型并不要求具有與分組所對(duì)應(yīng)的概念。也就是說(shuō),對(duì)分組進(jìn)行解碼所得到的域可以在應(yīng)用類型中展開為一層。分組域指令的主要用途是使得可以用存在圖中的單個(gè)位元來(lái)指示一整組的域存在與否。group = element group nsname, presenceattr?, dictionaryattr?, typeref?, instruction* 6.3) 域操作符域操作符(field operator)規(guī)定了域編碼的優(yōu)化方式。不是任何操作符都可

24、任意地應(yīng)用到不同的域類型。雖然相應(yīng)的約束并不都在模式中明確表示,但在對(duì)每一操作符的描述文字中都做了明確的闡述。如果為操作符指定了不適用的域類型,則為一個(gè)靜態(tài)錯(cuò)誤 err s2。fieldop = constant | default | copy | increment | delta | tail6.3.1) 字典與前值一些操作符依賴于前值(previous value)。前值在帶名的字典中維護(hù)。字典是一個(gè)條目集合。其中,每一條目具有名稱及特定類型的值。值可為以下三種的狀態(tài)之一:未定義(undefined),空(empty),已指定(assigned)。在處理開始時(shí),所有值的狀態(tài)均為未定義。

25、已指定狀態(tài)表示前值存在,空狀態(tài)表示前值不存在。空狀態(tài)只適用于可選的域。關(guān)于何時(shí)設(shè)置空狀態(tài),請(qǐng)參見“存在圖和空值使用”小節(jié)的介紹。操作符在字典中的前值,是與其關(guān)鍵字名稱相同的條目的值。操作符的缺省關(guān)鍵字(key)是其域的名稱。顯式的關(guān)鍵字可以用“關(guān)鍵字(key)”參數(shù)來(lái)指定。通過指定顯式的關(guān)鍵字,不同名稱的域的操作符可以共享字典中的同一個(gè)前值條目,如果操作符的域的類型與所訪問的條目值的類型不相同,則動(dòng)態(tài)錯(cuò)誤err d4發(fā)生。字典的名稱在域操作符元素的“字典(dictionary)”參數(shù)中指定,或者在模式允許的在先的某處元素中指定。如果已有多個(gè)在先的“字典”參數(shù),則使用位置最近的元素的該參數(shù)。如果

26、沒有指定該參數(shù),則使用全局字典。第 7 頁(yè) 共 37 頁(yè)以下三種字典是預(yù)定義的:z 模板(template)字典:字典限于當(dāng)前模板使用。也就是說(shuō):當(dāng)且僅當(dāng)t1=t2,模板t1中操作符與模板t2中操作符共享相同的字典。z 類型(type)字典:字典限于當(dāng)前應(yīng)用類型使用。也就是說(shuō):當(dāng)且僅當(dāng)a1=a2,應(yīng)用類型a1的模板t1中的操作符與應(yīng)用類型a2的模板t2中的操作符共享相同的字典。z 全局(global)字典:字典為全局的。無(wú)論模板和應(yīng)用類型如何,所有操作符共享相同的字典。其余字典均稱為用戶自定義(user defined)字典。當(dāng)且僅當(dāng)指定的字典名稱相同時(shí),兩個(gè)操作符才共享同一用戶自定義字典。字

27、典可以被顯式地重置(reset)。重置一個(gè)字典將把其所有條目的狀態(tài)設(shè)置為未定義。關(guān)于如何通知一個(gè)解碼器或編碼器進(jìn)行重置,本規(guī)范不作規(guī)定。但在編碼器和解碼器中,重置出現(xiàn)的順序應(yīng)當(dāng)與流的內(nèi)容的順序相對(duì)應(yīng)。opcontext = dictionaryattr?, nskey?, initialvalueattr?dictionaryattr = attribute dictionary template | type | global | string nskey = keyattr, nsattr?keyattr = attribute key token 6.3.2) 初值初值(initial

28、value)為一個(gè)unicode字符集的字符串,由操作符元素的“值(value)”參數(shù)指定。該值可通過后文中“字符串轉(zhuǎn)換”小節(jié)中定義的方法轉(zhuǎn)換為域的類型。在對(duì)初值進(jìn)行解譯的時(shí)候,類型轉(zhuǎn)換過程中可能發(fā)生的動(dòng)態(tài)和可執(zhí)行錯(cuò)誤,均被認(rèn)為是靜態(tài)錯(cuò)誤 err s3。如果域?yàn)槭M(jìn)制數(shù)類型,類型轉(zhuǎn)換得到的值將被正規(guī)化。這樣做的原因是當(dāng)對(duì)指數(shù)和尾數(shù)單獨(dú)應(yīng)用操作符時(shí),它們必須是可預(yù)見的。十進(jìn)制數(shù)值的正規(guī)化是對(duì)尾數(shù)和指數(shù)進(jìn)行調(diào)整,使得尾數(shù)整除10的余數(shù)不為0:即尾數(shù)%10 0. 例如100*100 將被正規(guī)化為 1*102 。如果尾數(shù)為0,則正規(guī)化十進(jìn)制數(shù)的尾數(shù)為0,指數(shù)也為0.initialvalueattr =

29、 attribute value text 6.3.3) 常量操作符常量操作符(constant operator)規(guī)定域的值均相同。域值即為初值。如果指令上下文無(wú)初值則靜態(tài)錯(cuò)誤err s4發(fā)生。常量域的值不被傳送常量操作符適用于所有域類型。constant = element constant initialvalueattr 6.3.4) 缺省操作符缺省操作符(default operator)規(guī)定域的值在流中出現(xiàn),否則為初值。除非域是可選存在的,否則若指令上下文無(wú)初值的話,則靜態(tài)錯(cuò)誤err s5發(fā)生。如果域無(wú)初值、且是可選存在的,則當(dāng)流中域的值不存在時(shí),域被認(rèn)為不存在。缺省操作符適用于所

30、有域類型。default = element default initialvalueattr? 6.3.5) 拷貝操作符第 8 頁(yè) 共 37 頁(yè)拷貝操作符(copy operator)規(guī)定域值在流中是可選地存在的。如果值在流中存在,則成為新的前值。當(dāng)值在流中不存在,則根據(jù)前值的狀態(tài)分為以下三種情況作處理:z 已指定狀態(tài):則域值為前值。z 未定義狀態(tài):則域值為初值,并成為新的前值。如果指令上下文中無(wú)初值的話,除非域不是可選存在的,否則動(dòng)態(tài)錯(cuò)誤err d5發(fā)生。如果域是可選存在的,并且無(wú)初值,則該域被認(rèn)為不存在,前值變成空狀態(tài)。z 空狀態(tài):則域的值為空。如果域是可選的,則值被視作不存在。如果域是

31、必要的,則動(dòng)態(tài)錯(cuò)誤err d6發(fā)生??截惒僮鞣m用于所有的域類型。copy = element copy opcontext 6.3.6) 遞增操作符遞增操作符(increment operator)規(guī)定域的值在流中是可選存在的。如果值在流中存在,則成為新的前值。當(dāng)值在流中不存在,則根據(jù)前值的狀態(tài)分為以下三種情況處理:z 已指定狀態(tài):則域值為前值加1。計(jì)算得到的值成為新的前值。z 未定義狀態(tài):則域值為初值,并且成為新的前值。除非域是可選存在的,否則如果指令上下文沒有初值,則動(dòng)態(tài)錯(cuò)誤err d5發(fā)生。如果域?yàn)榭蛇x存在的,并且無(wú)初值,則域被視作不存在,同時(shí)前值的狀態(tài)變?yōu)榭?。z 空狀態(tài):則域值為空。

32、如果域是可選的,則值被視作不存在。如果域是必要的,則動(dòng)態(tài)錯(cuò)誤err d6發(fā)生。遞增操作符適用于整數(shù)域類型。整數(shù)的遞增為自加1。如果其值已經(jīng)是類型最大值,則遞增后的值為最小值。increment = element increment opcontext 6.3.7) 差值操作符差值操作符(delta operator)規(guī)定流中存在差值。如果域是可選存在的,則差值可為null。如果是這種情況,則該域值被視作不存在。其余情況,域值通過差值(delta value)和基值(basic value)的結(jié)合得到。delta = element delta opcontext 根據(jù)前值的狀態(tài),基值按照以下

33、方式來(lái)確定:z 已指定狀態(tài):則基值為前值。z 未定義狀態(tài):如果指令上下文中存在初值,則基值為初值。除此之外,使用由類型決定的缺省基值。z 空狀態(tài):如果前值為空則動(dòng)態(tài)錯(cuò)誤err d6發(fā)生。以下小節(jié)規(guī)定了差值的表示方法、缺省基值,以及如何根據(jù)類型進(jìn)行值的結(jié)合。) 整數(shù)的差值差值在傳送編碼中由一個(gè)整數(shù)差值表示。結(jié)合值是基值和差值的總和。第 9 頁(yè) 共 37 頁(yè)缺省的整數(shù)基值為0.如果結(jié)合的值大于特定整數(shù)類型的最大值,或小于特定整數(shù)類型的最小值,則可報(bào)告錯(cuò)誤err r4發(fā)生。備注:差值所需的整數(shù)大小可能大于域類型的特定大小。例如,如果無(wú)符號(hào)32位整數(shù)的基值為4294967295,新值為1

34、7,則需要帶符號(hào)64位整數(shù)來(lái)表示差值-4294967278。但是,這并不影響差值在流中的表示方式。) 十進(jìn)制數(shù)的差值差值在傳送編碼中以一個(gè)帶比例數(shù)字差值表示。通過將差值和基值的指數(shù)和位數(shù)部分分別對(duì)應(yīng)相加來(lái)計(jì)算結(jié)合的值。如果結(jié)合后的指數(shù)小于-63或大于63,或者結(jié)合后的尾數(shù)超過64位整數(shù)的表示范圍,則可報(bào)告錯(cuò)誤err r1發(fā)生。十進(jìn)制數(shù)的缺省基值為0,缺省基值的指數(shù)為0.備注:由于十進(jìn)制數(shù)的差值操作符包括單獨(dú)的指數(shù)和尾數(shù)差值,因此必須按照以下方式實(shí)現(xiàn)十進(jìn)制數(shù)的前值的保存,即必須保留指數(shù)和尾數(shù)部分的這種格式安排,或者使之可在處理下一個(gè)域時(shí)候被重新構(gòu)建。) ascii碼字

35、符串的差值差值在傳送編碼中以ascii碼字符串差值表示。差值的減除長(zhǎng)度(subtraction length) 規(guī)定了要從基值前端或后端移除的字符的數(shù)量。當(dāng)減除長(zhǎng)度為負(fù)(negative)時(shí),從前端移除。差值的字符串部分表示要添加到基值與減除長(zhǎng)度的符號(hào)所指定的同一端方向上的字符。減除長(zhǎng)度使用“額外減一(excess-1) ”的編碼方式: 解碼時(shí),如果值為負(fù),則加1后得到減除的字符數(shù)量。這使得可以將負(fù)0編碼為-1,以使得可在無(wú)需移除任何字符的情況下在前端進(jìn)行增加的操作。缺省基值為空字符串。如果減除的長(zhǎng)度大于基值中的字符數(shù)量,或者超出了32位帶符號(hào)整數(shù)的范圍,則動(dòng)態(tài)錯(cuò)誤err d7發(fā)生。6.3.7

36、.4) unicode字符串的差值unicode字符串的差值,除了具有差值中字符向量的內(nèi)容必須為utf-8類型字節(jié)的額外約束外,在結(jié)構(gòu)上與字符向量相同。差值是對(duì)編碼字節(jié),而不是unicode字符進(jìn)行操作,因此差值可能由一個(gè)不完整的utf-8字節(jié)序列構(gòu)成。結(jié)合值如果不是一個(gè)合法的 utf-8 序列的話,則可報(bào)告錯(cuò)誤err r2發(fā)生。) 字節(jié)向量的差值差值在傳送編碼中由一個(gè)字節(jié)向量差值表示。差值的減除長(zhǎng)度規(guī)定了從基值前端或后端移除的字節(jié)數(shù)量。當(dāng)減除長(zhǎng)度為負(fù)時(shí),字節(jié)從前端被移除。差值的字節(jié)向量部分表示要添加到基值與起始的減除長(zhǎng)度的符號(hào)所指定的同一端方向上的字節(jié)。減除長(zhǎng)度使用與ascii

37、碼字符串情況相同的“額外減一”的編碼方式: 如果解碼時(shí)值為負(fù),則加1后得到要減除的字符數(shù)量。缺省的基值為空的字符向量。第 10 頁(yè) 共 37 頁(yè)如果移除長(zhǎng)度大于基值的字符數(shù)量,或者超出了int32的表示范圍,則動(dòng)態(tài)錯(cuò)誤err d7發(fā)生。6.3.8) 接尾操作符接尾操作符(tail operator)規(guī)定在流中可選地存在一個(gè)尾值(tail value)。如果域?yàn)榭蛇x存在的,則尾值可為null。若為此情況,則域值被認(rèn)為不存在。否則,如果尾值存在,則通過將尾值和基值結(jié)合來(lái)得到域值。根據(jù)前值的狀態(tài),基值可根據(jù)以下方式確定:z 已指定狀態(tài):則基值為前值。z 未定義狀態(tài):則如果指令上下文中存在初值,則基值

38、為初值。其余情況,使用基于類型的缺省基值。z 空狀態(tài):如果指令上下文中存在初值,則基值為初值。其余情況,使用基于類型的缺省基值。結(jié)合的值成為新的前值。如果尾值在流中不存在,則根據(jù)前值的狀態(tài),域值以下方式進(jìn)行確認(rèn):z 已指定狀態(tài):則域值為前值。z 未定義狀態(tài):則域值為前值,且成為新的前值。除非該域?yàn)榭蛇x存在的,否則如果指令上下文無(wú)初值,則動(dòng)態(tài)錯(cuò)誤err d6發(fā)生。如果域?yàn)榭蛇x存在且無(wú)初值,則域被認(rèn)為不存在,且前值的狀態(tài)變?yōu)榭?。z 空狀態(tài):則域值為空。如果域是可選地,則值被視為不存在,如果域是必要的,則動(dòng)態(tài)錯(cuò)誤err d7發(fā)生。在具體語(yǔ)法中,接尾操作符以“”元素表示。tail = element

39、tail opcontext 以下的小節(jié)定義了尾值的表示方法、缺省的基值,以及如何根據(jù)類型進(jìn)行值的結(jié)合。接尾操作符只能應(yīng)用于這些類型上。) ascii字符串的接尾尾值在傳送編碼中以ascii碼字符串表示。字符串的長(zhǎng)度規(guī)定了從基值的后端移除的字符的數(shù)量。尾值表示附加到剩余字符串上的字符。如果尾值的長(zhǎng)度超過了基值的長(zhǎng)度,則結(jié)合后的值成為尾值。缺省的基值為空字符串(empty string)。) unicode字符串的接尾unicode字符串的尾值,除了具有差值中字符向量的內(nèi)容必須為utf-8類型的字節(jié)的額外約束外,在結(jié)構(gòu)上與字符向量的尾值相同。尾值操作是對(duì)編碼字節(jié)而非u

40、nicode字進(jìn)行操作,因此,尾值可能為一個(gè)不完整的utf-8字節(jié)序列。如果結(jié)合值不是一個(gè)合法的utf-8 序列的話,則可報(bào)告錯(cuò)誤err r2發(fā)生。) 字節(jié)向量的接尾尾值在傳送編碼中以字符向量表示。尾值的長(zhǎng)度規(guī)定了從基值的后端移除的字節(jié)的數(shù)量。尾值表示附加到剩余字節(jié)向量的字節(jié)。第 11 頁(yè) 共 37 頁(yè)如果尾值的長(zhǎng)度超過了基值的長(zhǎng)度,則結(jié)合后的值成為尾值。缺省的基值為空字節(jié)向量。6.4) 模版引用指令模版引用指令(template reference instruction)規(guī)定該模版的一部分由另一模版來(lái)定義。模版引用可以是靜態(tài)或者動(dòng)態(tài)的。當(dāng)指令中規(guī)定了名稱時(shí),引用為靜態(tài)的(st

41、atic),否則為動(dòng)態(tài)的(dynamic)。靜態(tài)引用表示應(yīng)當(dāng)將引用的模版作為當(dāng)前模版來(lái)繼續(xù)處理。靜態(tài)引用并不需要流中一定有存在圖或模版id。如果指定名稱的模版不存在,則動(dòng)態(tài)錯(cuò)誤err d8發(fā)生。動(dòng)態(tài)引用規(guī)定了流中存在一個(gè)存在圖和模版標(biāo)識(shí)符(template identifier),應(yīng)該以該標(biāo)識(shí)符所指示的模版作為當(dāng)前模版繼續(xù)進(jìn)行處理,并在傳送編碼中以一個(gè)段來(lái)進(jìn)行表示。如果與流中出現(xiàn)的模版標(biāo)識(shí)符所關(guān)聯(lián)的模版不存在,則動(dòng)態(tài)錯(cuò)誤err d9發(fā)生。當(dāng)處理進(jìn)行到引用的靜態(tài)或動(dòng)態(tài)模版的終止處時(shí),當(dāng)前模版被恢復(fù),并從引用指令后的執(zhí)行點(diǎn)繼續(xù)進(jìn)行處理。templateref = element templater

42、ef ( nameattr, templatensattr? )? 7) 名稱模版定義中的名稱由兩部分組成:命名空間(namespace)uri和本地名稱。應(yīng)用類型、域和操作符關(guān)鍵字的命名空間uri由“ns”參數(shù)指定,它可與本地名稱出現(xiàn)在相同的元素中,也可出現(xiàn)在任一在先元素中。如果在先部分已經(jīng)出現(xiàn)了多個(gè)ns參數(shù),則采用位置最近元素的該參數(shù)。如果沒有指定“ns”參數(shù),則命名空間的uri為空字符串。模版的命名空間uri由“templatens”參數(shù)指定,其繼承方式與ns參數(shù)相同。為模版名稱單獨(dú)設(shè)置一個(gè)參數(shù)的原因是消息和文件名常常使用同一個(gè)標(biāo)準(zhǔn)化的命名空間,但是模版名稱則經(jīng)常包含在供應(yīng)商規(guī)定的命名空

43、間中。采用uri的命名空間并不表示其必須指向一個(gè)資源。此處使用uri形式僅僅是為了對(duì)語(yǔ)法進(jìn)行規(guī)范,同時(shí)也推薦使用諸如公司或者組織的url來(lái)生成全局唯一的命名空間。本地名稱由參數(shù)“名稱(name)”指定。兩個(gè)名稱相同,當(dāng)且僅當(dāng)它們的命名空間標(biāo)識(shí)符和本地名稱都相同。nsname = nameattr, nsattr?, idattr?templatensname = nameattr, templatensattr?, idattr?nameattr = attribute name token nsattr = attribute ns text templatensattr = attribu

44、te templatens text idattr = attribute id token 7.1) 輔助標(biāo)識(shí)符任何一個(gè)可以帶名稱,且不是一個(gè)引用的構(gòu)件,還可以帶有一個(gè)輔助的標(biāo)識(shí)符 (auxiliary identifier),該標(biāo)識(shí)符由“標(biāo)識(shí)符(id)”參數(shù)指定。本規(guī)范不對(duì)輔助標(biāo)識(shí)符的使用語(yǔ)義做任何規(guī)定。也不對(duì)標(biāo)識(shí)符的作用范圍做規(guī)定。但是,對(duì)于一個(gè)特定的適用于fast的通信協(xié)議,可以選擇對(duì)輔助標(biāo)識(shí)符的使用作出限制。例如,當(dāng)使用fast傳送fix消息時(shí),輔助標(biāo)識(shí)符的一個(gè)典型應(yīng)用是用來(lái)指定每一個(gè)域的fix標(biāo)簽號(hào)碼。輔助標(biāo)識(shí)符另一個(gè)可能的應(yīng)用,是在雙方通信不支持動(dòng)態(tài)模版交換和標(biāo)識(shí)符指定的時(shí)候,指

45、定靜態(tài)的模版標(biāo)識(shí)符。第 12 頁(yè) 共 37 頁(yè)備注:本規(guī)范提供了帶內(nèi)指定輔助標(biāo)識(shí)符的方法,但并不表示不能采用其他的帶內(nèi)(如通過外來(lái)元素或參數(shù),參見“可擴(kuò)展性”小節(jié))或者帶外的模式將輔助標(biāo)識(shí)符映射為構(gòu)件的名稱。8) 類型轉(zhuǎn)換如果模版的某個(gè)域的類型與當(dāng)前應(yīng)用類型所對(duì)應(yīng)的域的類型不一致,則對(duì)域進(jìn)行編碼或者解碼時(shí),必須進(jìn)行值的轉(zhuǎn)換。本節(jié)對(duì)不同類型間進(jìn)行兩兩的轉(zhuǎn)換進(jìn)行了定義。字節(jié)向量只能與字符串進(jìn)行相互轉(zhuǎn)換。字節(jié)向量與其余類型的轉(zhuǎn)換均為一個(gè)動(dòng)態(tài)錯(cuò)誤err d10。8.1) 字符串轉(zhuǎn)換為其他類型在以下的小節(jié)中,“空白切除(whitespace trimming)”是指在字符串被解譯前將位于起始和結(jié)尾處的空

46、白移除的操作。下列十六進(jìn)制ascii碼的字符被視作空白:20 (空格), 09 (橫向制表符), 0d (回車), and 0a (換行).如果一個(gè)字符串與下列小節(jié)中所規(guī)定的語(yǔ)法不匹配,則動(dòng)態(tài)錯(cuò)誤err d11發(fā)生。備注: 雖然帶符號(hào)整數(shù)和十進(jìn)制數(shù)的語(yǔ)法允許形如-0和-0.0的負(fù)零值,但此類值將被正規(guī)化為正數(shù)形式。負(fù)零值在fast流中無(wú)法表示。8.1.1) 轉(zhuǎn)換為整數(shù)字符串被作為09數(shù)字的序列解譯。如果為帶符號(hào)類型,則允許以起始的減號(hào)來(lái)表示負(fù)數(shù)。文字已經(jīng)過空白切除。如果結(jié)果數(shù)字超出了特定整數(shù)的大小,則可報(bào)告錯(cuò)誤 err r4發(fā)生。例如,如果類型為int8的話,則字符串“4711”將導(dǎo)致錯(cuò)誤。8

47、.1.2) 轉(zhuǎn)換為十進(jìn)制數(shù)字符串具有一個(gè)整數(shù)部分和一個(gè)小數(shù)部分。允許對(duì)兩者進(jìn)行指定,或者只對(duì)其中之一進(jìn)行指定。如果對(duì)兩者都進(jìn)行了指定,則它們之間必須帶有小數(shù)點(diǎn)。起始的減號(hào)表示是負(fù)數(shù)。例如,1,1.1,.1,和-0.1都為允許的表達(dá)方式。文字已經(jīng)過空白切除。如果轉(zhuǎn)換結(jié)果的指數(shù)小于-63或者大于63,或者尾數(shù)超過int64的表示范圍,則可報(bào)告錯(cuò)誤err r1 發(fā)生。8.1.3) 轉(zhuǎn)換為字節(jié)向量字符串被作為偶數(shù)個(gè)的0-9a-fa-f的十六進(jìn)制數(shù)字解譯, 其中可能夾帶有空白。首先通過剝離所有的空白,文字轉(zhuǎn)換為一個(gè)字節(jié)向量。然后,其中的每對(duì)字符被作為表示單字節(jié)的十六進(jìn)制數(shù)解譯。8.1.4) 字符集間的相

48、互轉(zhuǎn)換ascii是unicode的一個(gè)子集,因此將ascii碼字符串轉(zhuǎn)換為unicode字符串較為簡(jiǎn)單。如果unicode字符串只包含ascii字符的話,可以轉(zhuǎn)換為ascii碼字符串,否則將是一個(gè)可報(bào)告錯(cuò)誤err r3。8.2) 整數(shù)轉(zhuǎn)換為其他類型8.2.1) 轉(zhuǎn)換為整數(shù)第 13 頁(yè) 共 37 頁(yè)只要沒有精度丟失,不同類型的整數(shù)可以進(jìn)行相互的轉(zhuǎn)換。如果目標(biāo)類型無(wú)法表示值的話,則可報(bào)告錯(cuò)誤err r4發(fā)生。例如,一個(gè)負(fù)值不能轉(zhuǎn)換為一個(gè)無(wú)符號(hào)類型。8.2.2) 轉(zhuǎn)換為十進(jìn)制數(shù)如果可以由一個(gè)指數(shù)范圍為-63 , 63 、尾數(shù)為int64的帶比例數(shù)表示,則一個(gè)整數(shù)可以被轉(zhuǎn)換為十進(jìn)制數(shù),否則可報(bào)告錯(cuò)誤e

49、rr r1發(fā)生。8.2.3) 轉(zhuǎn)換為字符串?dāng)?shù)字由0 9的一個(gè)數(shù)字序列表示。數(shù)字不能以0作為起始。如果類型是帶符號(hào)的,且數(shù)字為負(fù),則數(shù)字序列的前面接一個(gè)減號(hào)(-)。8.3) 十進(jìn)制數(shù)轉(zhuǎn)換為其他類型8.3.1) 轉(zhuǎn)換為整數(shù)當(dāng)前僅當(dāng)無(wú)小數(shù)部分時(shí),一個(gè)十進(jìn)制數(shù)可以轉(zhuǎn)換為一個(gè)整數(shù)。也就是說(shuō),其值實(shí)際上為一個(gè)整數(shù)。如果其值實(shí)際上不為一個(gè)整數(shù),則可報(bào)告錯(cuò)誤 err r5 發(fā)生。8.3.2) 轉(zhuǎn)換為字符串如果數(shù)字實(shí)際上是一個(gè)整數(shù),則其當(dāng)作整數(shù)類型進(jìn)行轉(zhuǎn)換。否則數(shù)字由以小數(shù)點(diǎn)分隔的一個(gè)整數(shù)部分和一個(gè)小數(shù)部分表示。每一部分均為0 9的數(shù)字序列。小數(shù)點(diǎn)的兩邊都必須至少有1個(gè)數(shù)字。如果數(shù)字為負(fù)的,則前面接減號(hào)(-)。

50、整數(shù)部分不能以0開始.8.4) 字節(jié)向量轉(zhuǎn)換為字符串字節(jié)向量由偶數(shù)個(gè)0-9 a-f的十六進(jìn)制數(shù)字的序列表示。其中每一對(duì)是表示向量中一個(gè)字節(jié)的十六進(jìn)制數(shù)。9) 可擴(kuò)展性使用“外來(lái)(foreign)”參數(shù)和元素,可以將特定于應(yīng)用層的數(shù)據(jù),添加到xml格式的模版定義結(jié)構(gòu)中。模式中的任一元素可以帶有外來(lái)參數(shù)和外來(lái)子元素。一個(gè)外來(lái)參數(shù)是一個(gè)帶名參數(shù),其名稱的命名空間uri即非空字符串,也非模版的命名空間uri。一個(gè)外來(lái)元素是一個(gè)帶名元素,其名稱的命名空間uri與模版的命名空間uri不同。外來(lái)子元素可以相對(duì)其他子元素任意放置。外來(lái)參數(shù)和元素的內(nèi)容不受限制。在模式中使用“other”樣式來(lái)實(shí)現(xiàn)可擴(kuò)展性的部分

51、,“other”樣式可利用交錯(cuò)式的操作被放置到模式里的相關(guān)位置。other = foreignattr*, foreignelm*foreignelm = element * - td:* any foreignattr = attribute * - (local:* | td:*) text any = attribute * text *, ( text | element * any )*10) 傳送編碼下面的擴(kuò)展巴科斯范式(ebnf)語(yǔ)法規(guī)定了fast流的總體結(jié)構(gòu)。其中,末端符號(hào)為斜體,起始符號(hào)為stream。stream := message* | block*block := blocksize message+第 14 頁(yè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論