国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

數(shù)據(jù)類(lèi)型研究及在數(shù)據(jù)流讀取中的應(yīng)用

2015-07-24 11:27夏顯鄂
電腦知識(shí)與技術(shù) 2015年14期
關(guān)鍵詞:數(shù)據(jù)類(lèi)型數(shù)據(jù)流

夏顯鄂

摘要:為了提高數(shù)據(jù)流檢驗(yàn)效率,論述了C語(yǔ)言中整型、實(shí)型、數(shù)組、結(jié)構(gòu)體等各種數(shù)據(jù)類(lèi)型的具體內(nèi)容,在內(nèi)存中的存儲(chǔ)形式,和大小端字節(jié)序的判斷及轉(zhuǎn)換方法。應(yīng)用數(shù)據(jù)類(lèi)型的性質(zhì),提出了不需要重復(fù)編譯的數(shù)據(jù)流讀取應(yīng)用,描述了用戶(hù)操作接口,文件讀取基本開(kāi)發(fā)流程,闡述了在一維和多維數(shù)組,或者在結(jié)構(gòu)體文件等情況下進(jìn)行解析等關(guān)鍵技術(shù),取得了較好的使用效果,同樣適用于網(wǎng)絡(luò)數(shù)據(jù)流。

關(guān)鍵詞:數(shù)據(jù)類(lèi)型;大小端字節(jié)序;數(shù)據(jù)流;詞法分析;編譯

中圖分類(lèi)號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)14-0001-03

Abstract: To improve efficiency of testing data stream, concrete content of data type in C language is discussed, for example integer, real, array, struct etc. Data type store in memory, judgment and convert method of big-little endian byte order are depicted. With data type property, application of reading data stream without compiling repeatedly is presented. Users operation interface, main develop procedure of reading file, key technology of one dimension and many dimension array resolution, or struct file analysis are described. Take effect better in practice and apply to network data stream.

Key words: data type; big-little endian byte order; data stream; lexical analysis; compile

著名計(jì)算機(jī)科學(xué)家尼古拉斯.沃斯(Niklaus Wirth)提出一個(gè)公式:數(shù)據(jù)結(jié)構(gòu)+算法=程序。程序主要包括兩方面的內(nèi)容:

1)數(shù)據(jù)的描述。程序中數(shù)據(jù)的類(lèi)型和數(shù)據(jù)的組織形式(數(shù)據(jù)結(jié)構(gòu))。

2)操作的描述。操作步驟(算法)。

數(shù)據(jù)是操作的對(duì)象,操作是對(duì)數(shù)據(jù)進(jìn)行加工處理,得到期望結(jié)果。算法處理的對(duì)象是數(shù)據(jù),數(shù)據(jù)以某種特定形式存在,如整數(shù)、實(shí)數(shù)、字符等。不同數(shù)據(jù)之間還存在某些聯(lián)系,如字符數(shù)組由若干字符組成等等。數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)的組織形式,如數(shù)組就是一種數(shù)據(jù)結(jié)構(gòu)。處理同一類(lèi)問(wèn)題,如果數(shù)據(jù)結(jié)構(gòu)不同,算法也會(huì)不同,而數(shù)據(jù)結(jié)構(gòu)正是以數(shù)據(jù)類(lèi)型的形式出現(xiàn)的。

1研究?jī)?nèi)容

1.1數(shù)據(jù)類(lèi)型

C語(yǔ)言中數(shù)據(jù)有常量和變量之分。程序中用到的所有數(shù)據(jù)都需要指定數(shù)據(jù)類(lèi)型,包括基本類(lèi)型,構(gòu)造類(lèi)型,指針類(lèi)型和空類(lèi)型。其中基本類(lèi)型有整型、字符型、實(shí)型。構(gòu)造類(lèi)型是由基本類(lèi)型的數(shù)據(jù)按一定規(guī)則組成的,包括數(shù)組類(lèi)型、結(jié)構(gòu)體類(lèi)型、共用體類(lèi)型,和枚舉類(lèi)型。這些數(shù)據(jù)類(lèi)型能構(gòu)成更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如指針和結(jié)構(gòu)體可以構(gòu)成棧、樹(shù)、圖等復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

1.1.1整型

整型數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存放的,任何整形類(lèi)型的對(duì)象x的底層二進(jìn)制都是這樣的,假設(shè)有n位存儲(chǔ)空間,dn-1dn-2…d2d1d0,其中每一個(gè)d為0或者1。對(duì)x計(jì)算等價(jià)的十進(jìn)制數(shù)值,與x是有符號(hào)類(lèi)型還是無(wú)符號(hào)類(lèi)型相關(guān)。

1.1.2字符型

字符常量是用單引號(hào)括起來(lái)的一個(gè)字符。字符常量只能是單個(gè)字符,不能是字符串。轉(zhuǎn)義字符是以斜線(xiàn)“\”開(kāi)頭,后跟一個(gè)或幾個(gè)字符,具有特定的含義。

字符變量用來(lái)存放字符常量,只能存放一個(gè)字符,是將字符相應(yīng)的ASCII碼放到存儲(chǔ)單元中,它的存儲(chǔ)形式與整數(shù)的存儲(chǔ)形式類(lèi)似,所以一個(gè)字符數(shù)據(jù)既能以字符形式輸出,也能以整數(shù)形式輸出。

1.1.3 實(shí)型

實(shí)型數(shù)據(jù)又稱(chēng)為浮點(diǎn)型數(shù)據(jù)。實(shí)型數(shù)據(jù)的存儲(chǔ)方式是按照指數(shù)形式存儲(chǔ)。實(shí)型數(shù)據(jù)被分成小數(shù)部分和指數(shù)部分,分別存放。指數(shù)部分采用規(guī)范化的指數(shù)形式。

1.1.4數(shù)組類(lèi)型

數(shù)組是有序數(shù)據(jù)的集合。數(shù)組中的每一個(gè)元素都屬于同一個(gè)數(shù)據(jù)類(lèi)型,用一個(gè)統(tǒng)一的數(shù)組名和下標(biāo)來(lái)唯一地確定數(shù)組中的元素?;蛘哒f(shuō),數(shù)組是一組連續(xù)的內(nèi)存單元,這些內(nèi)存單元具有相同的大小,每一個(gè)單元被稱(chēng)為數(shù)組元素或者數(shù)組項(xiàng)。

一個(gè)數(shù)組可以分解為多個(gè)數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類(lèi)型或是構(gòu)造類(lèi)型,或是指針類(lèi)型。因此按數(shù)組元素的類(lèi)型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)體數(shù)組等各種類(lèi)別。其中,字符串作為字符數(shù)組存放,字符串結(jié)束標(biāo)志以字符‘\0代表。系統(tǒng)對(duì)字符串常量自動(dòng)加一個(gè)‘\0結(jié)束符,作為一維數(shù)組。

數(shù)組中各元素有先后順序,它們?cè)趦?nèi)存中按照這個(gè)先后順序連續(xù)存放在一起。

1.1.5結(jié)構(gòu)體類(lèi)型

在一個(gè)組合項(xiàng)中包含若干個(gè)類(lèi)型不同或者相同的數(shù)據(jù)項(xiàng),這樣的一種數(shù)據(jù)類(lèi)型稱(chēng)為結(jié)構(gòu)體類(lèi)型。根據(jù)不同的編譯器,內(nèi)存存儲(chǔ)會(huì)有所不同,在存儲(chǔ)結(jié)構(gòu)體時(shí)會(huì)按照內(nèi)存對(duì)齊進(jìn)行相關(guān)處理,用戶(hù)可以通過(guò)預(yù)處理命令#pragma pack(n), n=1,2,4,8,16來(lái)改變對(duì)齊系統(tǒng)。

1.1.6共用體類(lèi)型

幾種不同類(lèi)型的變量存放到同一段內(nèi)存單元中,也就是使用覆蓋技術(shù),幾個(gè)變量互相覆蓋。這種使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu),稱(chēng)為共用體,也稱(chēng)之為聯(lián)合體。共用體變量的地址和它的成員的地址都是同一地址,共用體的長(zhǎng)度以成員長(zhǎng)度中最大的為準(zhǔn)。

1.1.7枚舉類(lèi)型

如果一個(gè)變量只有幾種可能的值,可以定義為枚舉類(lèi)型。“枚舉”是指將變量的值一一列舉出來(lái),變量的值只限于列舉出來(lái)的值的范圍。定義枚舉類(lèi)型后,可以聲明該枚舉類(lèi)型的變量,然后使用該變量存儲(chǔ)枚舉元素的數(shù)值,以防止用戶(hù)提供無(wú)效值,使代碼更加清晰。

1.1.8指針類(lèi)型

變量的指針就是變量的地址。存放變量地址的變量是指針變量,用來(lái)指向另一個(gè)變量。C語(yǔ)言規(guī)定所有變量在使用前都需要定義和指定類(lèi)型,并按此分配內(nèi)存單元,而指針變量是專(zhuān)門(mén)用來(lái)存放地址的,需要定義為指針類(lèi)型,其基類(lèi)型用來(lái)指定該指針變量指向的變量的類(lèi)型。

1.1.9空類(lèi)型

用void定義空類(lèi)型,或者稱(chēng)為無(wú)類(lèi)型。一般不要求返回函數(shù)值的函數(shù),定義為void類(lèi)型,保證正確調(diào)用,減少程序出錯(cuò)。函數(shù)的參數(shù)如果是任意類(lèi)型指針,應(yīng)聲明為void *類(lèi)型 。

1.2大小端字節(jié)序

因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,以字節(jié)為單位,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit。C語(yǔ)言中除了8bit的char之外,還有16bit的short型,32bit的long型等。對(duì)于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),就存在如何將多個(gè)字節(jié)安排的問(wèn)題,所以就有了大端存儲(chǔ)模式和小端存儲(chǔ)模式。

大端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中,地址由小向大增加,而數(shù)據(jù)從高位向低位放;

小段模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中,高地址部分權(quán)值高,低地址部分權(quán)值低。

判斷計(jì)算機(jī)的大小端字節(jié)序,可以使用共用體方法。

因?yàn)閑ndian共用體只有一片內(nèi)存,所有成員共享此片內(nèi)存區(qū)域,并且大小為最大的成員所占的空間,所以endian共用體內(nèi)存為2個(gè)字節(jié)。

先給短整形變量sh賦值為1,用字符型的變量c從共享內(nèi)存中取數(shù)據(jù),只能取得低字節(jié)數(shù)據(jù)。如果是小端字節(jié)序,內(nèi)存中存放數(shù)據(jù)為0x0001,c取得的數(shù)據(jù)是0x01,打印結(jié)果是1,如果是大端字節(jié)序,內(nèi)存中存放數(shù)據(jù)為0x0100,c取得的數(shù)據(jù)是0x00,打印結(jié)果是0。

2.1 需求描述

在開(kāi)發(fā)人員進(jìn)行系統(tǒng)開(kāi)發(fā)時(shí),經(jīng)常遇到這樣的情況,需要查看二進(jìn)制數(shù)據(jù)流信息,通常采用的方法是,顯示二進(jìn)制數(shù)據(jù)轉(zhuǎn)換后的十六進(jìn)制數(shù)據(jù),選取若干位,利用計(jì)算器進(jìn)行換算,得到可讀的十進(jìn)制。或者通過(guò)編程實(shí)現(xiàn)讀取該數(shù)據(jù)流,每次進(jìn)行重復(fù)編譯,再打印得到結(jié)果。有沒(méi)有一種方法可以實(shí)現(xiàn)選擇數(shù)據(jù)流,得到直接可讀的結(jié)果呢?這樣就可以大幅地提高調(diào)試效率。以32位機(jī)器,文件數(shù)據(jù)流為例,開(kāi)發(fā)了應(yīng)用。

首先進(jìn)行用戶(hù)界面設(shè)計(jì),輸入將要讀取的數(shù)據(jù)流文件名和讀取位置、變量名、類(lèi)型,進(jìn)行讀取,顯示結(jié)果。其中輸入位置、變量名和類(lèi)型的部分如圖2。

2.2基本流程。

處理界面列表,以結(jié)構(gòu)體方式存儲(chǔ)列表{int 位移量,char[…] 變量名,char[…] 類(lèi)型名},建立結(jié)構(gòu)體數(shù)組。

2.2.1打開(kāi)文件

使用fopen函數(shù)。

FILE *fp=fopen(文件名,使用文件方式);

文件名為要讀取的二進(jìn)制流文件。

使用文件方式為讀取二進(jìn)制型。

2.2.2文件定位

使用fseek函數(shù),改變文件的位置指針。

fseek(文件類(lèi)型指針,位移量,起始點(diǎn))

“起始點(diǎn)”選擇“文件開(kāi)始”。

“位移量”指以“起始點(diǎn)”為基點(diǎn),向前移動(dòng)的字節(jié)數(shù)。這里填寫(xiě)用戶(hù)界面表格中的起始位置+位移量。

2.2.3讀文件,并取得數(shù)據(jù)。

使用fread函數(shù)。

fread(buffer,size,count,fp);

buffer:是一個(gè)指針,這里是讀入數(shù)據(jù)的存放地址。size:要讀取的字節(jié)數(shù)。

count:要進(jìn)行讀寫(xiě)多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng)。

fp:文件。

根據(jù)列表結(jié)構(gòu)體的位置和類(lèi)型,讀取相應(yīng)長(zhǎng)度的字節(jié)數(shù)據(jù),放入相應(yīng)類(lèi)型變量的地址。如果是char型數(shù)據(jù)讀取1個(gè)字節(jié),如果是short 型讀取2個(gè)字節(jié)……等等,使用sizeof(數(shù)據(jù)類(lèi)型)函數(shù),即可得到數(shù)據(jù)類(lèi)型字節(jié)數(shù)量,由 if…else…語(yǔ)句完成字段類(lèi)型判斷和數(shù)據(jù)讀取,并轉(zhuǎn)變成字符串?dāng)?shù)據(jù),使用sprintf()函數(shù)。

char str[...]={0};

sprintf(str,”%d”,…);

將字符串與前面定義的列表結(jié)構(gòu)體數(shù)組對(duì)應(yīng)打印,即可得到用戶(hù)界面列表的數(shù)值結(jié)果。

2.2.4關(guān)閉文件

使用fclose函數(shù)關(guān)閉文件。

fclose(文件指針)

2.3關(guān)鍵技術(shù)

大小端字節(jié)序。在用戶(hù)界面表格中增加一列“大小端”,用戶(hù)指明數(shù)據(jù)流大小端字節(jié)序,否則按照計(jì)算機(jī)的大小端字節(jié)序進(jìn)行解析。

數(shù)組。針對(duì)于數(shù)組的解決方案,同樣需要在用戶(hù)界面表格中增加一列數(shù)組長(zhǎng)度字段。如果是一維數(shù)組,可以采用循環(huán)方式處理,在變量名后面注明下標(biāo),按順序處理數(shù)組長(zhǎng)度的數(shù)據(jù)。如果是多維數(shù)組,需要記錄維數(shù),并且記錄每一維度的數(shù)組長(zhǎng)度,之后采用遞歸算法,打印出變量下標(biāo),和順序處理多維數(shù)組的數(shù)據(jù)。

結(jié)構(gòu)體文本文件。如果有結(jié)構(gòu)體文本文件,不再需要輸入用戶(hù)界面表格,只要在用戶(hù)界面上添加一處輸入結(jié)構(gòu)體文件的編輯框,選擇結(jié)構(gòu)體文件,就可以進(jìn)行,但需要對(duì)結(jié)構(gòu)體文件進(jìn)行詞法分析,從左至右逐個(gè)字符地對(duì)文件進(jìn)行掃描,識(shí)別出單詞符號(hào),包括:

1)關(guān)鍵字,例如typedef,define,struct,int等。

2)標(biāo)識(shí)符,如變量名,數(shù)組名等

3)常數(shù),各種類(lèi)型的常數(shù),如2,5等

4)運(yùn)算符,如+,-等

5)界符,如逗點(diǎn),分號(hào),括號(hào)等。

按照結(jié)構(gòu)體文件解析結(jié)構(gòu)體,需要處理以下內(nèi)容:

1)將注釋屏蔽 。

2)將“define”宏定義內(nèi)容進(jìn)行代換。

3)將“typedef”聲明的類(lèi)型進(jìn)行代換。

4)包括“#include”所包含的文件內(nèi)容,一起進(jìn)行解析。

5)結(jié)構(gòu)體中出現(xiàn)結(jié)構(gòu)體變量?jī)?nèi)容,采用遞歸算法解析。

將解析的結(jié)構(gòu)體文件內(nèi)容按照類(lèi)似用戶(hù)界面表格樣式的結(jié)構(gòu)體數(shù)組存儲(chǔ),進(jìn)行順序讀取數(shù)據(jù)流。注意文件結(jié)構(gòu)體的對(duì)齊方式與數(shù)據(jù)流一致。

3 結(jié)束語(yǔ)

不進(jìn)行重復(fù)再編譯的,應(yīng)用數(shù)據(jù)類(lèi)型進(jìn)行讀取,除了讀取文件數(shù)據(jù)流,也可以應(yīng)用于實(shí)時(shí)讀取網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)流,進(jìn)行校驗(yàn),同時(shí)也能將例如數(shù)字文本轉(zhuǎn)換成整型或?qū)嵭蛿?shù)據(jù)用于網(wǎng)絡(luò)數(shù)據(jù)流發(fā)送檢驗(yàn)。本應(yīng)用大幅提高了調(diào)試效率,縮短了時(shí)間,可用于開(kāi)發(fā)和測(cè)試等諸多實(shí)踐中。本應(yīng)用沒(méi)有涉及共用體內(nèi)容,將在下一步工作中繼續(xù)完善。

參考文獻(xiàn):

[1] 譚浩強(qiáng). C程序設(shè)計(jì)[M]. 北京: 清華大學(xué)出版社, 2010.

[2] JASMIN B, MARK S.閆鋒欣, 張雪敏, 張君施, 等譯 C++ Qt設(shè)計(jì)模式[M]. 北京: 電子工業(yè)出版社, 2012.

[3] 肖軍模. 程序設(shè)計(jì)語(yǔ)言編譯方法[M]. 大連: 大連理工大學(xué)出版社, 2000.

[4] 張素琴. 編譯原理[M]. 北京: 清華大學(xué)出版社, 2012.

[5] 陳火旺. 程序設(shè)計(jì)語(yǔ)言編譯原理[M]. 北京: 國(guó)防工業(yè)出版社, 2000.

[6] 梁建軍. C語(yǔ)言數(shù)據(jù)類(lèi)型轉(zhuǎn)換的探討[J]. 電腦知識(shí)與技術(shù), 2010, 6(23): 6485-6487.

[7] 董鑫正. C語(yǔ)言教學(xué)中函數(shù)參數(shù)傳遞問(wèn)題探討[J]. 電腦知識(shí)與技術(shù), 2010, 8(7): 1688-1689, 1701.

[8] 陳輝, 周自立. 嵌入式系統(tǒng)實(shí)驗(yàn)關(guān)于大小端轉(zhuǎn)換方法的探討[J]. 實(shí)驗(yàn)室研究與探索, 2008, 27(5): 66-67, 91.

猜你喜歡
數(shù)據(jù)類(lèi)型數(shù)據(jù)流
詳談Java中的基本數(shù)據(jù)類(lèi)型與引用數(shù)據(jù)類(lèi)型
汽車(chē)維修數(shù)據(jù)流基礎(chǔ)(上)
如何理解數(shù)據(jù)結(jié)構(gòu)中的抽象數(shù)據(jù)類(lèi)型
汽車(chē)維修數(shù)據(jù)流基礎(chǔ)(下)
一種提高TCP與UDP數(shù)據(jù)流公平性的擁塞控制機(jī)制
S7—400PLC系統(tǒng)時(shí)間設(shè)置方法及在煉鋼廠中的應(yīng)用
基于數(shù)據(jù)流的結(jié)構(gòu)化功能安全分析方法
基于數(shù)據(jù)流聚類(lèi)的多目標(biāo)跟蹤算法
基于自定義XML數(shù)據(jù)類(lèi)型的研究
VB語(yǔ)言的教學(xué)方法探討
宝坻区| 蒙山县| 台南县| 米脂县| 电白县| 河西区| 洪湖市| 炉霍县| 民和| 永丰县| 连州市| 通海县| 邯郸县| 陈巴尔虎旗| 丰顺县| 阳山县| 乐昌市| 平度市| 通城县| 青田县| 广宗县| 博湖县| 东乌珠穆沁旗| 泰顺县| 罗城| 普格县| 长岭县| 大姚县| 铁力市| 贵州省| 明星| 怀集县| 安康市| 壶关县| 南城县| 清河县| 新乡县| 都江堰市| 晋宁县| 扶沟县| 广东省|