亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        夏顯鄂

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

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

        中圖分類號(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ù)的類型和數(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)。處理同一類問題,如果數(shù)據(jù)結(jié)構(gòu)不同,算法也會(huì)不同,而數(shù)據(jù)結(jié)構(gòu)正是以數(shù)據(jù)類型的形式出現(xiàn)的。

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

        1.1數(shù)據(jù)類型

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

        1.1.1整型

        整型數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存放的,任何整形類型的對(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)類型還是無符號(hào)類型相關(guān)。

        1.1.2字符型

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

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

        1.1.3 實(shí)型

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

        1.1.4數(shù)組類型

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

        一個(gè)數(shù)組可以分解為多個(gè)數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構(gòu)造類型,或是指針類型。因此按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)體數(shù)組等各種類別。其中,字符串作為字符數(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)體類型

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

        1.1.6共用體類型

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

        1.1.7枚舉類型

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

        1.1.8指針類型

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

        1.1.9空類型

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

        1.2大小端字節(jié)序

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

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

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

        2.2基本流程。

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

        2.2.1打開文件

        使用fopen函數(shù)。

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

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

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

        2.2.2文件定位

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

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

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

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

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

        使用fread函數(shù)。

        fread(buffer,size,count,fp);

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

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

        fp:文件。

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

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

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

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

        2.2.4關(guān)閉文件

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

        fclose(文件指針)

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

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

        數(shù)組。針對(duì)于數(shù)組的解決方案,同樣需要在用戶界面表格中增加一列數(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)體文本文件,不再需要輸入用戶界面表格,只要在用戶界面上添加一處輸入結(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ù),各種類型的常數(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”聲明的類型進(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)容按照類似用戶界面表格樣式的結(jié)構(gòu)體數(shù)組存儲(chǔ),進(jìn)行順序讀取數(shù)據(jù)流。注意文件結(jié)構(gòu)體的對(duì)齊方式與數(shù)據(jù)流一致。

        3 結(jié)束語

        不進(jìn)行重復(fù)再編譯的,應(yīng)用數(shù)據(jù)類型進(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í)間,可用于開發(fā)和測(cè)試等諸多實(shí)踐中。本應(yīng)用沒有涉及共用體內(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ì)語言編譯方法[M]. 大連: 大連理工大學(xué)出版社, 2000.

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

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

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

        [7] 董鑫正. C語言教學(xué)中函數(shù)參數(shù)傳遞問題探討[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ù)類型數(shù)據(jù)流
        詳談Java中的基本數(shù)據(jù)類型與引用數(shù)據(jù)類型
        汽車維修數(shù)據(jù)流基礎(chǔ)(上)
        如何理解數(shù)據(jù)結(jié)構(gòu)中的抽象數(shù)據(jù)類型
        汽車維修數(shù)據(jù)流基礎(chǔ)(下)
        一種提高TCP與UDP數(shù)據(jù)流公平性的擁塞控制機(jī)制
        S7—400PLC系統(tǒng)時(shí)間設(shè)置方法及在煉鋼廠中的應(yīng)用
        基于數(shù)據(jù)流的結(jié)構(gòu)化功能安全分析方法
        基于數(shù)據(jù)流聚類的多目標(biāo)跟蹤算法
        北醫(yī)三院 數(shù)據(jù)流疏通就診量
        范疇數(shù)據(jù)類型上的子類型*
        天堂精品人妻一卡二卡| 天堂aⅴ无码一区二区三区| 人人爽人人爽人人爽人人片av| 无码国产一区二区三区四区| 日日摸夜夜添夜夜添无码免费视频| 天天躁日日躁狠狠躁一区| 亚洲综合久久1区2区3区 | 熟妇人妻无乱码中文字幕av| 久久精品国产亚洲av香蕉| 野狼第一精品社区| 亚洲国产麻豆综合一区| 亚洲夫妻性生活视频网站| 国产午夜激情视频在线看| 丰满的少妇av一区二区三区| 少妇高潮太爽了在线视频| 欧美日韩精品一区二区三区高清视频| 日本VA欧美VA精品发布| 亚洲女同成av人片在线观看 | 醉酒后少妇被疯狂内射视频| 亚洲综合色秘密影院秘密影院| 人妻系列无码专区久久五月天| 一区二区亚洲精美视频| 国产精品日韩av一区二区三区| 国产欧美日韩中文久久| 777亚洲精品乱码久久久久久| 国产精品免费久久久久影院| 五月丁香六月综合激情在线观看| 成年毛片18成年毛片| 青青草在线免费观看在线| 亚洲 另类 小说 国产精品| 国精产品一区一区三区有限公司杨| 国产va免费精品观看| 中文字幕av一区二区三区| 亚洲一区极品美女写真在线看| 白白色发布在线观看视频| 国产大屁股视频免费区| 亚洲va无码手机在线电影| 香蕉久久夜色精品国产2020| 久久久久久岛国免费网站| 国产成人高清视频在线观看免费| 极品人妻少妇av免费久久|