前段时间做一个考勤系统,用到一个crc16的算法,于是上网搜索,很多资料,奈何版本各不相同,都不能满足现有的需求,于是还是看合作方实现的c#代码:整理如下:
C#代码:
using System;
using System.Collections.Generic;
using System.Text;
class Program
{
public static class CRC16
{
// Methods
public static ushort GetCRC16(byte[] inf)
{
CRC16_Table table = new CRC16_Table();
ushort num = 0;
for (int i = 0; i < inf.Length; i++)
{
int ind = (num & 0xff) ^ inf[i];
num = (ushort)((num >>
^ table[ind]);
}
return num;
}
public static byte GetLastCRC(byte[] order)
{
return order[order.Length - 1];
}
public static byte GetLastCRC(ushort crc16)
{
string str = Convert.ToString((int)crc16, 2);
int length = str.Length - 8;
string str2 = "00000000";
string str3 = (length <= 0) ? str2 : str.Substring(0, length);
string str4 = (length <= 0) ? str : str.Substring(length,
;
byte num2 = Convert.ToByte(str3, 2);
byte num3 = Convert.ToByte(str4, 2);
return (byte)(num2 ^ num3);
}
public static byte[] GetOrder(byte[] inf)
{
byte lastCRC = GetLastCRC(GetCRC16(inf));
List<byte> list = new List<byte>();
list.AddRange(inf);
list.Add(lastCRC);
return list.ToArray();
}
}
internal class CRC16_Table : List<ushort>
{
// Methods
public CRC16_Table()
{
base.AddRange(this.crc_table());
}
private ushort[] crc_table()
{
return new ushort[] {
0, 0xc0c1, 0xc181, 320, 0xc301, 960, 640, 0xc241, 0xc601, 0x6c0, 0x780, 0xc741, 0x500, 0xc5c1, 0xc481, 0x440,
0xcc01, 0xcc0, 0xd80, 0xcd41, 0xf00, 0xcfc1, 0xce81, 0xe40, 0xa00, 0xcac1, 0xcb81, 0xb40, 0xc901, 0x9c0, 0x880, 0xc841,
0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
};
}
}
都说c#与java很相似,于是java版本的crc16位算法诞生,
java代码:
import java.util.ArrayList;
import java.util.List;
public class CRC16 {
static char[] table ={
0x0000, 0xc0c1, 0xc181, 0x140, 0xc301, 0x3c0, 0x280, 0xc241, 0xc601, 0x6c0, 0x780, 0xc741, 0x500, 0xc5c1, 0xc481, 0x440,
0xcc01, 0xcc0, 0xd80, 0xcd41, 0xf00, 0xcfc1, 0xce81, 0xe40, 0xa00, 0xcac1, 0xcb81, 0xb40, 0xc901, 0x9c0, 0x880, 0xc841,
0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740,0xf501, 0x35c0,0x3480, 0xf441,
0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1,0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
};
public static int GetCRC16(byte[] inf)
{
int num = 0;
for (int i = 0; i < inf.length; i++)
{
int td=inf[i];
if(td<0){
td+=256;
}
int ind = (int)(num & 0xff) ^ td;
char ti= table[ind];
num = (int) (((num >>
) ^ ti);
}
return num;
}
public static byte[] GetInfo(byte[] order)
{
List<Byte> list = new ArrayList<Byte>();
for (int i = 0; i < (order.length - 1); i++)
{
list.add(order[i]);
}
byte[] dest=new byte[order.length-1];
System.arraycopy(order, 0, dest, 0, dest.length);
return dest;
}
public static byte GetLastCRC(byte[] order)
{
return order[order.length - 1];
}
public static int GetLastCRC(int crc16)
{
String str = Integer.toBinaryString( crc16) ;
int length = str.length() - 8;
String str2 = "00000000";
String str3 = (length <= 0) ? str2 : str.substring(0, length);
String str4 = (length <= 0) ? str : str.substring(length, str.length());
int num2 =Integer.parseInt(str3,2);
int num3 = Integer.parseInt(str4,2);
return (num2 ^ num3);
}
public static byte[] getOrder(byte[] inf)
{
int lastCRC = GetLastCRC(GetCRC16(inf));
byte[] dest=new byte[inf.length+1];
System.arraycopy(inf, 0, dest, 0, inf.length);
dest[inf.length]=(byte)lastCRC;
return dest;
}
}
}
分享到:
相关推荐
在本文中,我们介绍了CRC16校验算法的原理,并使用C#语言实现了CRC16校验算法。我们还将其应用于串口通信中,以检测数据传输中的错误。CRC16校验算法是一种简单而有效的错误检测方法,广泛应用于数据传输和存储中。
CRC算法参数模型解释: NAME:参数模型名称。 WIDTH:宽度,即CRC比特数。 POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。 INIT:这是算法...
在实际项目中,我们需要根据具体需求选择适当的CRC算法,例如CRC16,它具有较高的检错能力且计算相对简单。同时,理解MODBUS协议的细节,如命令格式、错误处理和异常响应,对于实现高效可靠的RS485通信系统是至关...
CRC8校验程序 /********************************************************************************************************* ** Function name: CountCrc ** Descriptions: CRC校验码计算子程序 ** input ...
本篇主要介绍16位、32位以及64位数据如何转换为浮点型(float)和双浮点型(double)。 首先,我们要理解二进制、16进制与浮点数的关系。计算机内部存储数字都是以二进制形式,而16进制是人类更易读的一种表示方式...
在实际应用中,除了奇偶校验,还有其他的校验方法,如CRC(循环冗余校验)、MD5(消息摘要算法5)和SHA(安全散列算法)等,它们提供了更高级别的错误检测能力。但奇偶校验因其简单和快速,在某些场景下仍具有实用性...
在VS2008项目中,源代码可能会实现CRC算法的不同版本,如CRC-8、CRC-16或CRC-32等,这些版本根据其生成多项式的比特长度而有所不同。 奇偶校验(Parity Check)是一种基础的校验方法,它通过计算数据中的“1”位...
DLT645协议解析器及modbus CRC和DLT CS校验码计算,支持两种输入格式,带空格和不带空格。默认需要安装微软VS2012发布包。 比如输入FE FE FE FE 68 AA AA AA AA AA AA 68 13 00 DF 16,解析出结果如下: [11-05 08:...
完美兼容的C#版本, ,快速构建游戏前后端网络库 优化: 基于事件驱动,充分利用多核 优化fastack逻辑,降低10%流量 优化check函数。 优化集合迭代器。 包含fec,降低延迟 附带crc32校验 使用时间轮,优化大量连接cpu
学习和理解这段源码,你可以深入理解CRC32算法的实现细节,如何在易语言环境下处理字节流,以及如何与其他编程语言(如C++、C#、Java等)中的CRC32算法进行对比。同时,这也是提升易语言编程技巧,特别是涉及数据...
2. **CRC16数据校验**:CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输错误检测的校验算法,其中CRC16是最常见的一种。它通过计算数据的多项式和预设的生成多项式进行异或运算,生成一个16位...
从标签来看,这个修复工具可能与Web开发技术有关,比如AJAX、C#、Java、JSP和Spring。虽然这些技术主要用于构建Web应用程序,但它们也可能被用在工具的后台服务中,例如: - **AJAX**:可能用于创建交互式的用户...
在实现这个转换源代码的过程中,开发者需要熟悉C++、C#、Java等编程语言,以及相关的图像处理库,如OpenCV、ImageMagick等。源代码可能分为多个步骤,包括读取BMP文件,进行色彩空间转换,执行DCT、量化和熵编码,...
这个软件源代码的编写可能采用了特定的编程语言,如Python、Java或C#,这些语言都支持对Unicode字符集的处理,因此能够正确处理中文字符。 QR码生成的过程通常包括以下步骤: 1. **信息编码**:首先,程序会将输入...
6. **编程接口**:对于开发者,各种编程语言都有处理ZIP文件的库,如Python的`zipfile`,Java的`java.util.zip`,JavaScript的`adm-zip`,C#的`System.IO.Compression.ZipFile`等。这些库提供了创建、读取、写入和...
3. 计算校验码:协议通常要求对报文头和报文体进行校验,可以采用CRC校验或其他算法,确保数据在传输过程中的完整性。 4. 组装完整数据包:将报文头、报文体和校验码组合成一个完整的数据包,发送到指定的服务器。 ...
5. **错误校验**:对数据进行CRC(Cyclic Redundancy Check)或其他错误检测算法,确保数据的完整性。 6. **解析DF17帧**:对DF17格式的帧进行解析,提取出各个字段,如飞机的ICAO地址、时间戳、GPS坐标等。 7. **...
藉由加強與優化許多函數及演算法,Notepad++ 致力於減少世界二氧化碳的排放。當使用較少的 CPU 功率,降低電腦系統能源消耗,Notepad++ 間接造就了綠化的環境。多虧它的輕巧與執行效率,Notepad++ 可完美地取代微軟...
我们看到了“META-INF/MANIFEST.MF”这一行,这表明此文件可能包含了一个名为`MANIFEST.MF`的元数据文件,该文件通常出现在Java应用程序的JAR或WAR文件中,用于描述项目的信息,如主类、依赖库版本等。 #### 游戏...
例如,最新的版本可能增加了对更复杂通信场景的支持,如多表并行通信、加密算法的更新等。同时,新的标准如DLMS/COSEM(国际电工委员会的智能电表通信协议)也逐渐成为趋势,它们在DLT-614的基础上,进一步提升了...