`

crc16位算法 java 与 c# 版本

阅读更多
前段时间做一个考勤系统,用到一个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;
    }



        }
}


0
0
分享到:
评论
2 楼 minn84 2013-04-04  

yaoneng 写道
iteye里面有 代码编辑器的,然后你发布出来的代码就不用这么难看了



多谢你这位大 的提醒,不过我当时确实是用代码编辑器,可能用得不纯熟,出现这种情况,不过你的这个提醒令我想起网上流行的一张图片,大意是:系统再怎么烂,代码一定要写得好看.....  
1 楼 yaoneng 2013-04-03  
iteye里面有 代码编辑器的,然后你发布出来的代码就不用这么难看了

相关推荐

    C#实现CRC16校验

    在本文中,我们介绍了CRC16校验算法的原理,并使用C#语言实现了CRC16校验算法。我们还将其应用于串口通信中,以检测数据传输中的错误。CRC16校验算法是一种简单而有效的错误检测方法,广泛应用于数据传输和存储中。

    CRC-16/MODBUS-JAVA

    CRC算法参数模型解释: NAME:参数模型名称。 WIDTH:宽度,即CRC比特数。 POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。 INIT:这是算法...

    RS485串口调试案例(带CRC校检)

    在实际项目中,我们需要根据具体需求选择适当的CRC算法,例如CRC16,它具有较高的检错能力且计算相对简单。同时,理解MODBUS协议的细节,如命令格式、错误处理和异常响应,对于实现高效可靠的RS485通信系统是至关...

    CRC8校验,生成多项式:X8 + X2 + X + 1

    CRC8校验程序 /********************************************************************************************************* ** Function name: CountCrc ** Descriptions: CRC校验码计算子程序 ** input ...

    16位转浮点型float,MODBUS 32位转浮点型float 64位转双浮点型double

    本篇主要介绍16位、32位以及64位数据如何转换为浮点型(float)和双浮点型(double)。 首先,我们要理解二进制、16进制与浮点数的关系。计算机内部存储数字都是以二进制形式,而16进制是人类更易读的一种表示方式...

    CheckSum 十六进制 奇偶校验

    在实际应用中,除了奇偶校验,还有其他的校验方法,如CRC(循环冗余校验)、MD5(消息摘要算法5)和SHA(安全散列算法)等,它们提供了更高级别的错误检测能力。但奇偶校验因其简单和快速,在某些场景下仍具有实用性...

    LRC CRC 字符串转换十六进制 奇偶校验 和校验

    在VS2008项目中,源代码可能会实现CRC算法的不同版本,如CRC-8、CRC-16或CRC-32等,这些版本根据其生成多项式的比特长度而有所不同。 奇偶校验(Parity Check)是一种基础的校验方法,它通过计算数据中的“1”位...

    DLT645协议解析器及modbus CRC和DLT CS校验码计算工具

    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:...

    java-Kcp:基于java的netty实现的可靠udp网络库(kcp算法),包含fec实现,可用于游戏,视频,加速等业务

    完美兼容的C#版本, ,快速构建游戏前后端网络库 优化: 基于事件驱动,充分利用多核 优化fastack逻辑,降低10%流量 优化check函数。 优化集合迭代器。 包含fec,降低延迟 附带crc32校验 使用时间轮,优化大量连接cpu

    易语言CRC32校验源码-易语言

    学习和理解这段源码,你可以深入理解CRC32算法的实现细节,如何在易语言环境下处理字节流,以及如何与其他编程语言(如C++、C#、Java等)中的CRC32算法进行对比。同时,这也是提升易语言编程技巧,特别是涉及数据...

    Serialport接收并保存串口的数据

    2. **CRC16数据校验**:CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输错误检测的校验算法,其中CRC16是最常见的一种。它通过计算数据的多项式和预设的生成多项式进行异或运算,生成一个16位...

    RAR修复工具

    从标签来看,这个修复工具可能与Web开发技术有关,比如AJAX、C#、Java、JSP和Spring。虽然这些技术主要用于构建Web应用程序,但它们也可能被用在工具的后台服务中,例如: - **AJAX**:可能用于创建交互式的用户...

    一个把BMP压缩成JPG的源代码

    在实现这个转换源代码的过程中,开发者需要熟悉C++、C#、Java等编程语言,以及相关的图像处理库,如OpenCV、ImageMagick等。源代码可能分为多个步骤,包括读取BMP文件,进行色彩空间转换,执行DCT、量化和熵编码,...

    可生成中文的QR码生成软件源代码

    这个软件源代码的编写可能采用了特定的编程语言,如Python、Java或C#,这些语言都支持对Unicode字符集的处理,因此能够正确处理中文字符。 QR码生成的过程通常包括以下步骤: 1. **信息编码**:首先,程序会将输入...

    4_1.zip

    6. **编程接口**:对于开发者,各种编程语言都有处理ZIP文件的库,如Python的`zipfile`,Java的`java.util.zip`,JavaScript的`adm-zip`,C#的`System.IO.Compression.ZipFile`等。这些库提供了创建、读取、写入和...

    HJ212-2017协议C语言实现,支持协议组包.zip

    3. 计算校验码:协议通常要求对报文头和报文体进行校验,可以采用CRC校验或其他算法,确保数据在传输过程中的完整性。 4. 组装完整数据包:将报文头、报文体和校验码组合成一个完整的数据包,发送到指定的服务器。 ...

    ADS-B-demodulated-code.rar_ADS-B DF17_ADS-B DF17_ADS_b_df17_民航

    5. **错误校验**:对数据进行CRC(Cyclic Redundancy Check)或其他错误检测算法,确保数据的完整性。 6. **解析DF17帧**:对DF17格式的帧进行解析,提取出各个字段,如飞机的ICAO地址、时间戳、GPS坐标等。 7. **...

    Notepad 5.2

    藉由加強與優化許多函數及演算法,Notepad++ 致力於減少世界二氧化碳的排放。當使用較少的 CPU 功率,降低電腦系統能源消耗,Notepad++ 間接造就了綠化的環境。多虧它的輕巧與執行效率,Notepad++ 可完美地取代微軟...

    最难小游戏的16进制源码

    我们看到了“META-INF/MANIFEST.MF”这一行,这表明此文件可能包含了一个名为`MANIFEST.MF`的元数据文件,该文件通常出现在Java应用程序的JAR或WAR文件中,用于描述项目的信息,如主类、依赖库版本等。 #### 游戏...

    DLT--614-2007多功能电能表通信协议.zip

    例如,最新的版本可能增加了对更复杂通信场景的支持,如多表并行通信、加密算法的更新等。同时,新的标准如DLMS/COSEM(国际电工委员会的智能电表通信协议)也逐渐成为趋势,它们在DLT-614的基础上,进一步提升了...

Global site tag (gtag.js) - Google Analytics