CRC16校验算法实现

循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

根据应用环境与习惯的不同,CRC又可分为以下几种标准:

①CRC-12码;

②CRC-16码;

③CRC-CCITT码;

④CRC-32码。

CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。

下面着重是CRC-16检验码的生成过程。

CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果 LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

下面为CRC16的计算过程,其中生成多项式为:X16+X15+X2+1:

1.设置CRC寄存器,并给其赋值FFFF(hex)。

2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。

3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与生成多项式码相异或。

5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。

6.重复第2至第5步直到所有数据全部处理完成。

7.最终CRC寄存器的内容即为CRC值。

 


校验码实现

 

编写CRC校验程序有两种办法:一种为计算法,一种为查表法。下面是查表法的C语言实现:


校验码算法程序实现样例(C语言):

// Test.cpp : Defines the entry point for the console application.

#include "stdafx.h"

static unsigned char auchCRCHi[]={
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
};
static unsigned char auchCRCLo[]={
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
};

unsigned short CRC16(unsigned char* puchMsg, unsigned short usDataLen)
{
    unsigned char uchCRCHi = 0xFF ;
    unsigned char uchCRCLo = 0xFF ;
    unsigned char uIndex ;
    while (usDataLen--)
    {
    uIndex = uchCRCHi ^ *puchMsg++;
    uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
    uchCRCLo = auchCRCLo[uIndex];
    }
    return (uchCRCHi << 8 | uchCRCLo) ;
};

void main(int argc, char* argv[])
{
    unsigned char src[21]={'1','2','3','6','3','4','2','3','4','2','9','8','7','3','6','5','2','8','9','3','5'};
    unsigned short code = CRC16(src,21);
    printf("the result is %d/n",code);
}

以下是Delphi实现的代码

unit CRC16;
interface
uses
  Windows, SysUtils;
  function CRC(a_strPuchMsg:string):LongWord;
implementation
const
  ct_ArrayCRCHi: array[0..255] of LongWord=
  (
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0,
    $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0,
    $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1,
    $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1,
    $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0,
    $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40,
    $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1,
    $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0,
    $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0,
    $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0,
    $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0,
    $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0,
    $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40,
    $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1,
    $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0,
    $80, $41, $00, $C1, $81, $40
  );
  ct_ArrayCRCLo:array[0..255] of LongWord=
  (
    $00, $C0, $C1, $01, $C3, $03, $02, $C2, $C6, $06,
    $07, $C7, $05, $C5, $C4, $04, $CC, $0C, $0D, $CD,
    $0F, $CF, $CE, $0E, $0A, $CA, $CB, $0B, $C9, $09,
    $08, $C8, $D8, $18, $19, $D9, $1B, $DB, $DA, $1A,
    $1E, $DE, $DF, $1F, $DD, $1D, $1C, $DC, $14, $D4,
    $D5, $15, $D7, $17, $16, $D6, $D2, $12, $13, $D3,
    $11, $D1, $D0, $10, $F0, $30, $31, $F1, $33, $F3,
    $F2, $32, $36, $F6, $F7, $37, $F5, $35, $34, $F4,
    $3C, $FC, $FD, $3D, $FF, $3F, $3E, $FE, $FA, $3A,
    $3B, $FB, $39, $F9, $F8, $38, $28, $E8, $E9, $29,
    $EB, $2B, $2A, $EA, $EE, $2E, $2F, $EF, $2D, $ED,
    $EC, $2C, $E4, $24, $25, $E5, $27, $E7, $E6, $26,
    $22, $E2, $E3, $23, $E1, $21, $20, $E0, $A0, $60,
    $61, $A1, $63, $A3, $A2, $62, $66, $A6, $A7, $67,
    $A5, $65, $64, $A4, $6C, $AC, $AD, $6D, $AF, $6F,
    $6E, $AE, $AA, $6A, $6B, $AB, $69, $A9, $A8, $68,
    $78, $B8, $B9, $79, $BB, $7B, $7A, $BA, $BE, $7E,
    $7F, $BF, $7D, $BD, $BC, $7C, $B4, $74, $75, $B5,
    $77, $B7, $B6, $76, $72, $B2, $B3, $73, $B1, $71,
    $70, $B0, $50, $90, $91, $51, $93, $53, $52, $92,
    $96, $56, $57, $97, $55, $95, $94, $54, $9C, $5C,
    $5D, $9D, $5F, $9F, $9E, $5E, $5A, $9A, $9B, $5B,
    $99, $59, $58, $98, $88, $48, $49, $89, $4B, $8B,
    $8A, $4A, $4E, $8E, $8F, $4F, $8D, $4D, $4C, $8C,
    $44, $84, $85, $45, $87, $47, $46, $86, $82, $42,
    $43, $83, $41, $81, $80, $40
  );
function CRC(a_strPuchMsg:string):LongWord;
var
  l_CRCHi, l_CRCLo, l_Index, l_DataLen, i:LongWord;
begin
  l_DataLen:= Length(a_strPuchMsg);
  l_CRCHi := $FF ;
  l_CRCLo := $FF ;
  l_Index :=0;
  i:=1;
  while (i<=l_DataLen) do
  begin
    l_Index := l_CRCHi xor Integer(a_strPuchMsg[i]);
    l_CRCHi := l_CRCLo xor ct_ArrayCRCHi[l_Index];
    l_CRCLo := ct_ArrayCRCLo[l_Index];
    Inc(i);
  end;
  Result:= (l_CRCHi shl 8) or l_CRCLo;
end;
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作  者:李小文 等 编著,超星格式 内容简介 本书全面介绍了第三代移动通信系统的体系结构,重点是我国具有自主知识产权的第三代移动通信系统TD-SCDMA技术。与其他介绍第三代移动通信的专著不同的是,本书把介绍的重点放在第三代移动通信技术所涉及的信令体系和实现方法方面。或者说,本书是从系统的角度来描述第三代移动通信系统,而对其涉及到的诸多算法并不作深入的介绍。全书按其自然结构分为上篇和下篇:上篇主要介绍了3GPP定义的第三代移动通信系统的网络结构及接口规范。下篇(从第6章开始)详细介绍了用户终端设备协议栈的开发流程以及开发过程中使用的工具。希望读者通过对协议栈开发流程的阅读,进一步加深对无线空中接口信令规范的理解。 本书与第三代移动通信的发展紧密结合,从协议栈开发的角度来阐述3GPP规范,因而更容易为读者所接受。本书可供从事移动通信系统研究和开发的工程技术人员和科研人员阅读,也可为高等院校通信专业的高年级本科生和研究生提供教学参考和毕业论文参考。 作者简介 目录 上 篇 第1章 概述 3 1.1 第三代移动通信的发展概况 3 1.1.1 第三代移动通信系统(3G)的发展历史 3 1.1.2 第三代移动通信系统概述 4 1.1.3 国际电联关于3G的频谱划分计划 5 1.1.4 3G系统的无线接口标准 6 1.2 IMT-2000介绍 6 1.2.1 TD-SCDMA(IMT-2000 CDMA TDD) 7 1.2.2 WCDMA(IMT-2000 CDMA DS) 9 1.2.3 CDMA 2000(IMT-2000 CDMA MC) 10 1.3 3GPP规范 11 1.3.1 IMT-2000无线接入网与核心网的标准化情况 11 1.3.2 IMT-2000标准化组织结构 11 1.3.3 3GPP2的标准化情况 13 1.3.4 3GPP的标准化进展 14 1.3.5 3GPP文档协议总体介绍 14 1.4 第三代移动通信系统采用的关键技术 18 1.4.1 多用户检测(Multi-user Detection) 18 1.4.2 Turbo编/译码(Turbo Encode/Decode) 24 1.4.3 软件无线电(Software Defined Radio) 26 1.4.4 智能天线(Smart Antenna) 28 第2章 网络结构及接口 32 2.1 网络结构 32 2.1.1 UMTS的通用协议结构 32 2.1.2 UTRAN 33 2.2 Iu接口 38 2.2.1 概述 38 2.2.2 Iu接口协议的功能 41 2.2.3 Iu无线网络层控制平面协议 44 2.2.4 Iu无线网络层用户平面协议 47 2.2.5 服务区广播协议 52 2.3 Iur接口 54 2.3.1 概述 54 2.3.2 Iur接口的协议结构 55 2.3.3 Iur无线网络层控制平面协议 56 2.3.4 Iur公共传输信道数据流用户平面协议 59 2.4 Iub接口 61 2.4.1 概述 61 2.4.2 Iub中Node B的逻辑模型 63 2.4.3 Iub接口的协议结构 65 2.4.4 Iub接口无线网络层控制平面协议 66 2.4.5 Iub 公共传输信道数据流用户平面协议 70 2.4.6 Iur/Iub DCH数据流用户平面协议 71 2.5 Uu接口 74 2.5.1 协议栈的层次结构 74 2.5.2 UE在空闲模式下的任务 74 2.5.3 UE在连接模式下的任务 81 2.6 呼叫建立过程中的网络信令流 81 2.6.1 寻呼过程 81 2.6.2 RRC连接的建立过程 83 2.6.3 DCCH的直接传输过程 87 第3章 物理层规范 89 3.1 物理层向上层提供的服务 89 3.1.1 控制信道 90 3.1.2 传输信道 91 3.1.3 物理层测量 94 3.2 物理信道 97 3.2.1 帧结构 98 3.2.2 时隙结构 99 3.2.3 物理信道的分类 103 3.3 信道的编码与复用 107 3.3.1 CRC校验 109 3.3.2 传输块的级连和分段 109 3.3.3 信道编码 110 3.3.4 无线帧长度均衡 115 3.3.5 第一次交织 115 3.3.6 无线帧分割 116 3.3.7 速率匹配 117 3.3.8 传输信道的复用 123 3.3.9 物理信道分割 124 3.3.10 第二次交织 124 3.3.11 子帧分割 125 3.3.12 物理信道映射 125 3.3.13 信道编码和复用举例 127 3.4 物理层控制信息的编码 131 3.4.1 传输格式组合指示(TFCI) 131 3.4.2 前向物理接入信道(FPACH) 134 3.4.3 寻呼指示信道(PICH) 134 3.5 扩频、扰码和调制 135 3.5.1 比特到信号星座图的映射 135 3.5.2 扩频 136 3.5.3 扰码 137 3.5.4 SYNC-DL、SYNC-UL和Midamble码 139 3.5.5 脉冲成形滤波器 139 3.6 物理层过程 140 3.6.1 小区选择 140 3.6.2 UE的功率控制过程 142 3.6.3 上行同步建立-随机接入过程 143 3.7 信道配置举例 146 3.7.1 传输信道信息 148 3.7.2 物理信道信息单元 150 第4章 链路层规范(RLC/MAC) 153 4.1 介质接入控制(MAC)子层 153 4.1.1 MAC子层提供的服务和MAC子层的功能 153 4.1.2 MAC子层的逻辑结构 154 4.1.3 逻辑信道和传输信道之间的映射 155 4.1.4 MAC实体 157 4.1.5 层间通信 163 4.1.6 对等层通信 165 4.1.7 基本过程 165 4.2 无线链路控制(RLC)子层 168 4.2.1 RLC子层的总体模型 169 4.2.2 RLC子层支持的功能 169 4.2.3 RLC子层提供给高层的服务 170 4.2.4 RLC子层与高层(RRC、PDCP、BMC)的层间通信原语 171 4.2.5 透明模式(TM)实体 172 4.2.6 非确认模式(UM)实体 175 4.2.7 确认模式(AM)实体 177 4.3 分组数据汇聚协议(PDCP)子层 188 4.3.1 协议结构 188 4.3.2 PDCP子层的功能 189 4.3.3 层间通信 190 4.3.4 对等层通信 191 4.4 广播/多播控制(BMC)子层 192 4.4.1 BMC子层的协议模型 192 4.4.2 BMC子层的服务和功能 193 4.4.3 层间通信 193 4.4.4 基本过程 195 第5章 空中接口层3规范 197 5.1 无线资源控制(RRC)子层 197 5.1.1 RRC子层的协议模型 197 5.1.2 RRC子层的状态和状态转移 200 5.1.3 RRC连接管理 203 5.1.4 无线承载控制 210 5.1.5 RRC连接移动性管理 212 5.1.6 测量过程 215 5.1.7 RRC连接建立过程的消息流图 218 5.2 非接入层 224 5.2.1 移动性管理(MM) 224 5.2.2 连接管理(CM) 235 5.3 空中接口的层3消息结构 243 5.3.1 基于字节的表描述 243 5.3.2 基于比特流的表描述 244 5.3.3 ASN.1描述 245 下 篇 第6章 UE任务描述 253 6.1 TSM标准 253 6.1.1 系统简介 253 6.1.2 TSM规范的结构 254 6.1.3 TSM规范与TD-SCDMA的差异 255 6.2 空闲模式 256 6.2.1 PLMN的选择过程 257 6.2.2 小区选择/重选过程 258 6.2.3 位置登记过程 261 6.3 RR连接建立 261 6.3.1 接入允许判断 262 6.3.2 上行同步的建立 262 6.3.3 随机接入 262 6.3.4 主信令链路的建立 263 6.3.5 RR连接建立过程中的其他任务 263 6.4 专有模式 264 6.4.1 SACCH过程 264 6.4.2 信道指派 264 6.4.3 切换 265 6.4.4 信道模式改变 265 6.4.5 加密模式设置 266 6.4.6 类标改变 266 6.4.7 类标询问 266 6.4.8 RR连接释放 266 6.4.9 服务小区/邻近小区的测量 267 第7章 原语及状态描述 268 7.1 系统结构 268 7.1.1 系统模块组成 268 7.1.2 系统接口 270 7.2 物理控制层(HL1) 271 7.2.1 原语定义 271 7.2.2 物理控制层的状态划分 272 7.3 数据链路层(DL) 277 7.3.1 原语定义 277 7.3.2 数据链路层的状态划分 278 7.4 无线资源管理(RRM)子层 282 7.4.1 原语定义 282 7.4.2 RRM子层的状态划分 283 7.5 移动性管理(MM)子层 292 7.5.1 原语定义 292 7.5.2 MM子层的状态划分 293 7.5.3 MM子层的状态跃迁及原语 294 7.6 连接管理(CM)子层 302 7.6.1 原语定义 302 7.6.2 CC子层的状态划分及跃迁 303 第8章 规范描述语言(SDL)描述 315 8.1 SDL的基本概念 315 8.1.1 SDL结构 316 8.1.2 数据处理 321 8.2 无线链路控制层(RLC)的SDL描述 322 8.2.1 概述 322 8.2.2 功能 322 8.2.3 与3GPP RLC的比较 323 8.2.4 接口原语定义 324 8.2.5 UE端RLC的状态 325 8.2.6 SDL的实现 325 第9章 仿真及测试 363 9.1 协议一致性测试和互操作性测试 363 9.1.1 协议测试概述 363 9.1.2 协议一致性测试 363 9.1.3 互操作性测试 365 9.2 TSM终端协议测试的模型 365 9.3 TD-SCDMA终端协议测试参照的标准和主要的测试项目 367 9.3.1 CC子层的测试 367 9.3.2 MM子层的测试 367 9.3.3 RR子层的测试 368 9.3.4 L2层的测试 369 9.3.5 HL1层的测试 369 9.3.6 整体测试 370 9.4 树表结合表示法--TTCN 370 9.4.1 测试目的 371 9.4.2 测试流程 371 9.4.3 TTCN的实现 372 9.5 SDL和TTCN协仿真的结果 373 9.6 在线测试 377 9.6.1 测试环境 377 9.6.2 有限状态机实现 381 9.6.3 测试过程 383 9.6.4 测试过程举例 384 附录A SDL使用指南 387 A.1 SDL软件安装 387 A.2 操作介绍 388 A.3 生成运行代码 393 附录B TTCN使用指南 400 B.1 概述 400 B.2 几个概念 400 B.3 测试模型 401 B.4 TTCN的Test Suite结构 401 B.5 TTCN Suite的组成 402 B.6 TTCN测试例的构造过程 405 B.7 一个假想的X协议和其IUT 405 B.8 基于X协议IUT的TTCN Test Suite的实现 408 B.9 SDL到TTCN-LINK自动转换步骤 423 B.10 TTCN和SDL的协仿真 424 附录C OMAP1510简介 426 C.1 概述 426 C.2 硬件结构 426 C.2.1 OMAP1510结构 426 C.2.2 OMAP1510外围接口 427 C.3 软件结构 430 缩略语 431 参考文献 437
CRC16校验算法是一种常用的循环冗余校验算法,用于检测数据传输中的错误。下面是CRC16校验算法的C++实现: ```cpp #include <cstdint> // CRC16校验表 const uint16_t crc16Table[256] = { 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, 0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, 0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, 0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD, 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5, 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C, 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974, 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, 0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, 0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, 0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738, 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70, 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7, 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, 0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, 0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, 0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, 0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134, 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C, 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3, 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60,0x1DE9, 0x2F72, 0x3EFB, 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, 0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, 0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, 0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, 0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78 }; // 计算CRC16校验值 uint16_t calculateCRC16(const uint8_t* data, size_t length) { uint16_t crc = 0xFFFF; for (size_t i = 0; i < length; ++i) { crc = (crc >> 8) ^ crc16Table[(crc ^ data[i]) & 0xFF]; } return crc; } ``` 以上是一个简单的CRC16校验算法的C++实现。你可以使用`calculateCRC16`函数来计算给定数据的CRC16校验值。注意,需要提供数据的指针和长度作为函数的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值