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