Vaisala CRC16

简介: CRC-16 COMPUTATION  The computation of the CRC is performed on the data response before parity is added.

CRC-16 COMPUTATION
  The computation of the CRC is performed on the data response before parity is added. All operations are assumed to be on 16 bit unsigned integers. The least significant bit is on the right. Numbers preceded by 0x are in hexadecimal. All shifts shift in a zero. The algorithm is:
Initialize the CRC to zero. For each character beginning with the address, up to but not including the carriage return (<cr>), do as follows:
{
  Set the CRC equal to the exclusive OR of the character and itself
  for count =1 to 8
  {
    if the least significant bit of the CRC is one
    {
      right shift the CRC one bit
      set CRC equal to the exclusive OR of 0xA001 and itself
    }else{
      right shift the CRC one bit
    }
  }
}


Encoding the CRC as ASCII Characters
  The 16 bit CRC is encoded to three ASCII characters by using the following algorithm:
  1st character = 0x40 OR (CRC shifted right 12 bits)
  2nd character = 0x40 OR ((CRC shifted right 6 bits) AND 0x3F)
  3rd character = 0x40 OR (CRC AND 0x3F)

  The three ASCII characters are placed between the data and <cr><lf>.
  Parity is applied to all three characters, if selected for the character frame.
  The CRC computation code is added to the end of the response, if the first letter of the command is sent by using lower case.


void CRC16(BYTE *Array, BYTE *Rcvbuf,unsigned int Len)
{
  unsigned int IX,IY,CRC;
  CRC=0;
  if (Len<=0)
  {
    CRC = 0;
  }else{
    Len--;
    for (IX=0;IX<=Len;IX++)
    {
      CRC=CRC^(unsigned int)(Array[IX]);
      for(IY=0;IY<=7;IY++)
      {
        if ((CRC&1)!=0)
        {
          CRC=(CRC>>1)^0xA001;
        }else{
          CRC=CRC>>1;
        }
      }
    }
  }
   Rcvbuf[0] = 0x40 | (CRC >> 12);//高位置
   Rcvbuf[1] = 0x40 | ((CRC >> 6) & 0x3F);//中位置
   Rcvbuf[2] = 0x40 | (CRC & 0x3F);//低位置
}

目录
相关文章
|
8月前
|
C++
C/C++给文件加crc校验
C/C++给文件加crc校验
129 1
|
8月前
|
算法 Java 索引
Byte Hex CRC计算笔记
Byte Hex CRC计算笔记
91 0
|
5月前
|
C#
C# CRC8
C# CRC8
44 0
|
8月前
CRC与FCS的区别和联系
CRC与FCS的区别和联系
352 0
|
算法
模二运算、循环冗余检验(CRC)
模二运算、循环冗余检验(CRC)
251 0
|
存储 编解码 算法
CRC校验原来这么简单
CRC校验原来这么简单
1006 0
CRC校验原来这么简单
CRC校验
CRC--循环冗余校验
CRC校验
|
算法
CRC 校验算法
CRC 校验算法
267 0
|
存储 算法 安全
MD5、SHA1、CRC32值是干什么的?
Hash,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值。也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。 MD5和SHA1可以说是目前应用最广泛的Hash算法,而它们都是以MD4为基础设计的。
341 0