一种基于字节流的解码方法_2

文档序号:9930937阅读:来源:国知局
0~7和字节0~255;
[0062] A36、对生成的HDLC_FLAG_FOUND表写入结束信息并关闭文件结束本次表生成。
[0063]本发明的进一步技术方案是:所述步骤B中单个byte的解码包括以下步骤:
[0064] B11、根据hdlc_state中记录的state值确定
[0065] zero_search/f lag_search/f iag_f ound 中的某个表格;
[0066] B12、根据hdlc_state中记录的1~_〇116和当前的解码byte获得新的状态表项hdlc_ statc_dccodc_tbl并使用byte X 7+r_one作为下标直接查表;
[0067] B13、根据 hdlc_state 中记录的 state 值在 HDLC_FLAG_SEARCH 表及 HDLC_FLAG_ FOUND表做状态转换处理;
[0068] B14、用hdlc_state_decode_tbl 中的 state和;r_one更新 hdlc_state 中记录state 和r_one 〇
[0069]本发明的进一步技术方案是:所述步骤B13中还包括以下步骤:
[0070] B131、判断状态是否跳转到HDLC_FLAG_FOUND表;如是,则执行步骤B132,如否,则 结束本次操作;
[0071 ] B132,新的HDLC帧开始去除hdlc_state_decode_tbl表中记录的输出值0_bitcnt 和;r_val;
[OO72] B133,将r_val中的0_bitcnt个有效值数据copy到外部缓冲区并结束本次操作。
[0073]本发明的进一步技术方案是:所述步骤B131还包括以下步骤:
[0074] B1311、判断状态是否跳转到HDLC_FLAG_FOUND表;如是,则执行步骤B1312,如否, 则表示HDLC-帧解码错误停止并取出hdlc_state_decode_tbl中的0_bitcnt和r_val,并执 行步骤1313;
[0075] B1312、判断是否收到新的HDLC标志b_nextfrm;如是,则表示前一帧HDLC解码完成 并取出 hdlc_state_decode_tbl 中的 0_bitcnt 和 r_val 并执行步骤 B1313,如否,则一帧 HDLC 解码进行中并取出hdlc_state_decode_tbl中的0_bitcnt和r_val并执行步骤B1314;
[0076] B1313、将r_val中的0_bitcnt个有效值和记录的前此解码的1~_^1组合为最后的 输出byte并执行步骤1315;
[0077] B1314、将r_val中的0_bitcnt个有效值和记录的前此解码的1~_^1组合后输出并 结束本次操作;
[0078] B1315、进行HDLG帧的CRC16校验并输出一帧的值且结束本次操作。
[0079] 本发明的有益效果是:最初采用bit解码算法,最多能够做到32路并发解码,在将 算法替换为byte解码后,最多能够做到128路并发解码,处理能力提高4倍。提高了处理能 力,节省了处理时间、提高了处理效率。
【附图说明】
[0080] 图1是HDLC解码状态机的不意图。
[0081] 图2 2.3.HDLC bU解码流程图。
[0082] 图 3 HDLC_ZERO_SEARCH的bit处理流程图。
[0083] 图 4 HDLC_FLAG_SEARCH的bit处理流程图。
[0084] 图5 HDLC_FLAG_FOUND的bit处理流程图。
[0085] 图6是本发明实施例提供的基于字节流的解码方法的流程图。
[0086] 图7是本发明实施例提供的生成HDLC_ZERO_SEARCH表的流程图。
[0087]图8是本发明实施例提供的生成HDLC_FLAG_SEARCH表的流程图。
[0088]图9是本发明实施例提供的生成HDLC_FLAG_FOUND表的流程图。
[0089]图10是本发明实施例提供的单个byte的解码的流程图。
[0090] 图11是本发明实施例提供的HDLC_FLAG_SEARCH的byte处理的流程图。
[0091]图12是本发明实施例提供的HDLC_FLAG_FOUND的byte处理的流程图。
【具体实施方式】
[0092]图6-12示出了,本发明提供的基于字节流的解码方法,,所述解码方法包括以下步 骤:
[0093] A、利用bit字节流解码算法生成byte的解码表;
[0094] B、根据新生成的解码表对输入的byte进行解码并输出结果。
[0095] 根据对bit解码算法的分析,主要需要优化的地方有两个:A、要解码的数据是按 bit处理。如果转换为按byte处理,就可以去掉单个byte的8次循环,将大大减少处理时间。 B、BU解码涉及到大量的比较操作。
[0096] 因此,新算法的主要思想是利用bit算法生成表格,在实际解码时,利用查表的方 法,直接得到结果,这样就可以大大减少上述的处理时间,达到优化的目的。
[0097] 通过分析bit流HDLC解码状态机,HDLC解码的核心算法是:在当前状态下,输入新 的bit值,将状态推动到新的状态。同理,如果输入新的byte,状态机通过8次变化,也是转换 到一个新的状态。这样就需要构造256X256的表格。再对解码过程进行分析:发现对解码最 大的影响是r_one,也就是连续收到bit 1的个数;根据输入byte和;r_one的值来构造表格,表 格就变成:256 X 7,表格的大小将大大减小。
[0098](注:连续7个bitl已经表示HDLC帧有问题了,状态会转换到ZER0_SEARCH,因此,不 可能有8个连续的bitl)。
[0099] 因此,新算法就是先根据上述思想构造转换的表格,实际解码时,直接查这些表 格,来获得by t e的新状态。
[0100] 基于byte的解码算法分成两个部分:解码表的生成和解码过程。
[0101]由于HDLC解码有三种状态(见bit解码算法),因此,需要生成三个解码表,分别对 应:HDLC_ZERO_SEARCH、HDLC_FLAG_SEARCH 和 HDLC_FLAG_FOUND 状态。
[0102] 每个状态表采用穷举的方法:也就是当前byte为0~255,在1〇1^为0~7的情况 下,使用bit流解码算法,获得转换后的状态,并将转换后的状态写入到转换表文件中。
[0103] 解码表的结构记录每个字节在当前状态的解码信息,这些信息将写入到文件中, 在解码前再导入到内存中,用于辅助解码过程。 struct hcllc_decode_state_tbl {
[0104] u8 stare; u8 r_onc; u8 r_\ al; ujnt 0_,bitcat;
[0105] ii-int b-ncxtfrm;
[0106] 对结构的简单说明:
[0107] state:解码状态机的状态;
[0108] r_one:收到连续bitl的个数;
[0109] r_val:记录解码的输出值;
[0110] o_b i t cnt: HDLC 解码输出 b i 1:在1~_^ 1 中的位置;
[0111] b_nextfrm:是否已经收到了 HDLC结束的Flag。
[0112]此结构表示一个状态,因此,每个解码表文件有255 X 7个这样的结构。
[0113] 为了便于在HDLC解码时使用这些表格,解码表是按C语言的要求写入文件,使用 时,直接将这些文件编译到执行程序中。
[0114] HDLC_ZERO_SEARCH 状态的文件为 hdlcO.c,全局变量名为 FAST_HDLC_DE ⑶ DE_ STATE_MACHINE HDLC_ZERO_SEARCH_SM,写入的流程图,如图7所示。
[0115] HDLC_FLAG_SEARCH 状态的文件为 hdlcl.c,全局变量名为 FAST_HDLC_DE ⑶ DE_ STATE_MACHINE HDLC_FLAG_SEARCH_SM,写入的流程图,如图8所示。
[0116] HDLC_FLAG_FOUND状态的文件为hd 1 c2 ? c,全局变量名为FAST_HDLC_DE⑶DE_ STATE_MACHINE HDLC_FLAG_FOUND_SM,写入的流程图,如图9所示。
[0117] 由于一次不能够将所有的bit全部解码,因此,必须要有一个结构来记录中间信 息,便于在多次调用的时候连续解码。 struct hd1c_state { u8 state; u8 r__one;
[0118] u_int o_bitcnt; u_lnt i_bitcnr; };
[0119] 对结构的简单说明:
[0120] state:解码状态机的状态;
[0121] r_one:收到连续bitl的个数;
[0122] o_bitcnt :HDLC解码输出bit在解码缓冲区中的位置;
[0123] i_bitcnt:当前要解码bit所在缓冲区中的位置。
[0124]在表格的支持下,HDLC解码变得相对比较简单。如图10所示,根据hdlc_state中记 录的当前状态,查询出当前状态对应的解码状态表,然后根据要解码的byte和hdl
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1