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

文档序号:9930937阅读:1060来源:国知局
一种基于字节流的解码方法
【技术领域】
[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)
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1