一種基于字節(jié)流的解碼方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于解碼技術(shù)領(lǐng)域,尤其涉及一種基于字節(jié)流的解碼方法。
【背景技術(shù)】
[0002] HDLC是電信產(chǎn)品中常用的物理層協(xié)議,ISDN-PRI和SS7信令就是建立在HDLC協(xié)議 之上。
[0003] HDLC bit流由"標(biāo)志+信息+FCS(CRC16)"構(gòu)成,由"標(biāo)志"字節(jié)開始,到下一個"標(biāo) 志"字節(jié)結(jié)束,中間部分就是"信息+FCS"。在規(guī)范中,最后2個字節(jié)是CRC16算法的校驗字,通 過CRC16算法計算的校驗結(jié)果來判斷信息是否完整。
[0004] "標(biāo)志"字節(jié):標(biāo)志字節(jié)也稱為Flag,用于HDLC信息幀之間的分界。也就是兩個HDLC 信息幀間必須有一個Flag,但也可能有多個Flag。Flag為"01111110"的bit流。
[0005] 為避免HDLC信息幀中有Flag相同的數(shù)據(jù),在發(fā)送端,連續(xù)5個bit 1就插入bit 0, 在接收端,如果收到連續(xù)的5個bit 1,后面的bit 0自動丟棄。
[0006] FCS:幀校驗。對于PRI/SS7規(guī)范,采用CRC16算法。
[0007] 為了拆分出信息部分和計算FCS,必須對整個bit流做處理。在常規(guī)上一般采用專 門的硬件芯片來做這個工作,但是,在某些情況下,也需要通過C代碼來實現(xiàn)HDLC的解碼。
[0008] 對于用程序?qū)崿F(xiàn)HDLC解碼,已經(jīng)有非常多的實踐,主要的優(yōu)化在于將復(fù)雜的 CRC16FCS計算表格化,而信息部分的解碼還是采用按b i t處理。
[0009] 字節(jié)流的HDLC解碼算法是從bit流解碼算法優(yōu)化過來的,因此,先介紹bit流HDLC 解碼算法。
[0010] HDLC解碼算法也是相對比較復(fù)雜,下面就最基本的部分做描述。
[0011] 解碼狀態(tài)機
[0012] 根據(jù)HDLC的特點,有如下的解碼過程狀態(tài):
[0013] HDLC_ZERO_SEARCH
[0014] 查找0。由于HDLC以flag開始,而flag是"01111110 '的bit流,因此,解碼的第一個 狀態(tài)就是查找0的狀態(tài)。
[0015] HDLC_FLAG_SEARCH
[0016] 查找HDLC的f lag。用于匹配后續(xù)的標(biāo)志b i t。
[0017] HDLC_FLAG_FOUND
[0018] Flag已經(jīng)找到,解碼HDLC信息字節(jié)。
[0019] HDLC解碼狀態(tài)機如圖1所示。
[0020] HDLC解碼流程的簡單描述:
[0021] HDLC解碼的初始狀態(tài)是ZER0_SEARCH狀態(tài),在此狀態(tài),需要查找bit流中的0,找到0 后,狀態(tài)切換到FLAG_SEARCH狀態(tài)。
[0022] 在FLAG_SEARCH狀態(tài):記錄收到的bit流,直到連續(xù)收到HDLC標(biāo)志"01111110",切換 至|JFLAG_F0UND狀態(tài)。另外,如果在此狀態(tài)收到連續(xù)的7個b i 11,切換到ZER0_SEARCH狀態(tài)。
[0023] 在FLAG_SEARCH狀態(tài):收到bitl時,如果已經(jīng)連續(xù)收到6個bitl,切換到ZER0_ SEARCH狀態(tài),否則,輸出解碼的bi 11。收到b i t0時,如果已經(jīng)連續(xù)收到6個bi 11,此時表示收 到一個HDLC Flag,HDLC幀解碼完成,進(jìn)行CRC16校驗,并輸出校驗后的HDLC幀數(shù)據(jù);如果已 經(jīng)連續(xù)收到5個bitl,此bitO是插入的bit,直接丟棄,清除連續(xù)bitl記錄;其它情況,輸出解 碼的bitO。
[0024] 記錄結(jié)構(gòu)
[0025] 由于一次不能夠?qū)⑺械腷it全部解碼,因此,必須要有一個結(jié)構(gòu)來記錄中間信 息,便于在多次調(diào)用的時候連續(xù)解碼。 struct hc!1c_statc { u8 state; uS r_one;
[0026] tLlGt a_.bitGnt; i_bitcnt; }.,.
[0027]對結(jié)構(gòu)的簡單說明:
[0028] state:解碼狀態(tài)機的狀態(tài);
[0029] r_one:收到連續(xù)bitl的個數(shù);
[0030] o_b i t ent: HDLC解碼輸出b i t在解碼緩沖區(qū)中的位置;
[0031 ] i_bitcnt:當(dāng)前要解碼bit所在緩沖區(qū)中的位置。
[0032] HDLC bU解碼流程:在前面信息的基礎(chǔ)上,解碼過程是比較容易描述和了解的。如 圖2所示。根據(jù)hd 1 c_s tat e中記錄的狀態(tài),進(jìn)行不同的解碼處理。
[0033]各個狀態(tài)的詳細(xì)描述。
[0034] HDLC_ZERO_SEARCH的bit處理,如圖3所示,由于在此狀態(tài)要查找HDLC Flag中的第 一個0,因此,只有收到bitO,才切換到FLAG_SEARCH狀態(tài)。
[0035] HDLC_FLAG_SEARCH的bit處理,如圖4所示,在此狀態(tài),要查找HDLC的整個標(biāo)志 (bit:01111110)。如果輸入bit是bitl,連續(xù)接收到1的記錄(r_one)增加1,如果已經(jīng)達(dá)到7 個bitl,轉(zhuǎn)換到ZER0_SEARCH狀態(tài)。如果輸入bit是bitO,如果r_one是6,表示HDLC Flag已經(jīng) 收到了,狀態(tài)轉(zhuǎn)換到FLAG_F0UND狀態(tài);否則,需要清除r_one的記錄。
[0036] HDLC_FLAG_F0UND的bit處理,如圖5所示,如果輸入是bitl,增加 r_one記錄。如果 r_one為7,狀態(tài)轉(zhuǎn)換到ZER0_SEARCH狀態(tài);否則,輸出bitl。如果輸入是bitO,可能會是HDLC Flag標(biāo)志。如果r_one為6,表示收到HDLC Flag,此幀結(jié)束,輸出HDLC幀數(shù)據(jù)。如果r_one是5, 此bitO是HDLC規(guī)則插入的額外的0,直接丟棄,否則,輸出bitO。同時,由于收到bitO,清除r_ one標(biāo)志。
【發(fā)明內(nèi)容】
[0037] 本發(fā)明的目的在于提供一種基于字節(jié)流的解碼方法,旨在解決上述的技術(shù)問題。
[0038] 本發(fā)明是這樣實現(xiàn)的,一種基于字節(jié)流的解碼方法,所述解碼方法包括以下步驟: [0039] A、利用bit字節(jié)流解碼算法生成byte的解碼表;
[0040] B、根據(jù)新生成的解碼表對輸入的byte進(jìn)行解碼并輸出結(jié)果。
[00411 本發(fā)明的進(jìn)一步技術(shù)方案是:所述步驟A中byte的解碼表包括HDLC_ZERO_SEARCH 表、HDLC_FLAG_SEARCH 表及 HDLC_FLAG_FOUND 表。
[0042] 本發(fā)明的進(jìn)一步技術(shù)方案是:所述HDLC_ZERO_SEARCH表生成包括以下步驟:
[0043] All、判斷產(chǎn)生hdlcO.c文件是否成功;如是,則寫入全局變量頭FAST_HDLC_ DECODE_STATE_MACHINE HDLC_ZERO_SEARCH_SM并執(zhí)行步驟A12,如否,則結(jié)束生成本表;
[0044] A12、枚舉所有的字節(jié)0~255和連續(xù)的bit(r_one)0~7;
[0045] A13、將ZER0_SEARCH 設(shè)置成r_one 值;
[0046] A14、調(diào)用bit流HDLC解碼并獲得struct hdlc_decode_state_tbl結(jié)構(gòu)值;
[0047] A15、將struct hdlc_decode_state_tbl結(jié)構(gòu)寫入文件并枚舉所有的連續(xù)的bitl (r_one)0~7和字節(jié)0~255;
[0048] A16、對生成的HDLC_ZERO_SEARCH表寫入結(jié)束信息并關(guān)閉文件結(jié)束本次表生成。
[0049]本發(fā)明的進(jìn)一步技術(shù)方案是:所述HDLC_FLAG_SEARCH表生成包括以下步驟:
[0050] A21、判斷產(chǎn)生hdlcl .c文件是否成功;如是,則寫入全局變量頭FAST_HDLC_ DECODE_STATE_MACHINE HDLC_FLAG_SEARCH_SM并執(zhí)行步驟A12,如否,則結(jié)束生成本表;
[0051 ] A22、枚舉所有的字節(jié)0~255和連續(xù)的bit(r_one)0~7;
[0052] A23、將FLAG_SEARCH 設(shè)置成 r_one 值;
[0053] A24、調(diào)用bit流HDLC解碼并獲得struct hdlc_decode_state_tbl結(jié)構(gòu)值;
[0054] A25、將struct hdlc_decode_state_tbl結(jié)構(gòu)寫入文件并枚舉所有的連續(xù)的bitl (r_one)0~7和字節(jié)0~255;
[0055] A26、對生成的HDLC_FLAG_SEARCH表寫入結(jié)束信息并關(guān)閉文件結(jié)束本次表生成。
[0056] 本發(fā)明的進(jìn)一步技術(shù)方案是:所述HDLC_FLAG_FOUND表生成包括以下步驟:
[0057] A31、判斷產(chǎn)生hdlc2.c文件是否成功;如是,則寫入全局變量頭FAST_HDLC_ DECODE_STATE_MACHINE HDLC_FLAG_FOUND_SM并執(zhí)行步驟A12,如否,則結(jié)束生成本表;
[0058] A32、枚舉所有的字節(jié)0~255和連續(xù)的bit(r_one)0~7;
[0059] A33、將FLAG_F0UND 設(shè)置成 r_one 值;
[0060] A34、調(diào)用bit流HDLC解碼并獲得struct hdlc_decode_state_tbl結(jié)構(gòu)值;
[0061 ] A35、將struct hdlc_decode_state_tbl結(jié)構(gòu)寫入文件并枚舉所有的連續(xù)的bitl (r_one)