<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA實現CRC16校驗

    要求:

    CRC循環冗余錯誤校驗計算方法

    CRC-16C(循環冗余錯誤校驗)生成CRC-16校驗字節的步聚如下:

    (1)裝入一個16位寄存器,所有數位均為1

    (2)16位寄存器的高位字節與開始8位字節進行“異或”運算。運算結果放入這個16位寄存器。

    (3)把這個16位寄存器向右移1位。

    (4a)若向右(標記位)移出的數位是1,則生成多項式1010000000000001和這個寄存器進行“異或”運算。

    (4b)若向右移出的數位是0,則返回(3)

    (5)重處處(3)(4),直至移出8位。

    (6)另外8位與該16位寄存器進行“異或”運算。

    (7)重處處(3)-(6),直至該報文所有字節均與16位寄存器進行“異或”運算,并移位8次。

    (8)這個16位寄存器的內容即2字節CRC錯誤校驗。

    public class CRC {
        
    private byte[] CRC=new byte[2];
        
        
    byte data;
        
    byte[] reg=new byte[2];
        
    byte[] ploy=new byte[2];
        
    byte Op;
        
        
    public CRC(byte[] source){
            
    //初始化多項式
            int temp=0xA001;
            ploy
    =InttoByteArray(temp,2);
            
    //初始化寄存器
            temp=0xFFFF;
            reg
    =InttoByteArray(temp,2);
            
            
    for(int i=0;i<source.length;i++){
                
    //獲取數據
                data=source[i];
                
    //與寄存器中數據進行異或操作
                reg[1]=(byte) (reg[1]^data);
                
    //移動數據
                for(int j=0;j<8;j++){
                    
    //獲取數據的最后一位,即被移動出的數據判斷是否與多項式異或
                    Op=reg[0];
                    
    //右移一位
                    reg=InttoByteArray(ByteArraytoInt(reg)>>1,2);
                    
    //如果移出數據為1
                    if((Op&0x01)==1){
                        
    //與多項式進行異或操作
                        reg[0]=(byte) (reg[0]^ploy[0]);
                        reg[
    1]=(byte) (reg[1]^ploy[1]);
                    }                
                }
            }
            CRC
    =reg;        
        }

        
    public byte[] getCRC() {
            
    return CRC;
        }
    //格式化輔助函數
        private static byte[] InttoByteArray(int iSource, int iArrayLen) {
            
    byte[] bLocalArr = new byte[iArrayLen];
            
    for ( int i = 0; (i < 4&& (i < iArrayLen); i++) {
                bLocalArr[i] 
    = (byte)( iSource>>8*& 0xFF );          
            }
            
    return bLocalArr;
        }
        
        
    private static int ByteArraytoInt(byte[] bRefArr) {
            
    int iOutcome = 0;
            
    byte bLoop;
            
            
    for ( int i =0; i<bRefArr.length ; i++) {
                bLoop 
    = bRefArr[i];
                iOutcome
    += (bLoop & 0xFF<< (8 * i);
              
            }         
            
    return iOutcome;
        }    
    }

    開始把高低位搞混了,以為reg[0]是高位,調整了半天。郁悶!
    另外,好像CRC算法也有好多種,我就沒在網上找到用戶要求的這種算法。貌似這個算法是Modbus協議中的CRC校驗方式。有待確認。

    posted on 2008-07-24 12:11 SeesSea 閱讀(8740) 評論(2)  編輯  收藏 所屬分類: JAVA

    評論

    # re: JAVA實現CRC16校驗 2011-09-23 17:09 大四喜

    我按照這個寫出來,還是驗證不正確,估計還是有錯誤的。  回復  更多評論   

    # re: JAVA實現CRC16校驗 2011-12-16 09:30 hujiaqimama

    我套用這個,還是驗證不正確,  回復  更多評論   

    <2008年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲一区精品无码| 亚洲无人区一区二区三区| 亚洲福利视频网址| 4444www免费看| 亚洲大尺码专区影院| 亚欧色视频在线观看免费| 亚洲福利秒拍一区二区| 999国内精品永久免费观看| 亚洲成年人电影网站| 国产人在线成免费视频| 亚洲熟女精品中文字幕| 啊灬啊灬别停啊灬用力啊免费看| 亚洲成AV人片高潮喷水| 亚洲成a人片在线观看日本麻豆 | 日韩精品无码免费一区二区三区| 亚洲国产精品无码专区影院| 四虎影视在线影院在线观看免费视频 | 亚洲Av无码专区国产乱码DVD| 最近中文字幕大全免费版在线| 亚洲AV乱码久久精品蜜桃 | 久久精品国产亚洲5555| 亚洲视频免费在线观看| 亚洲小说图区综合在线| 国产精品免费看香蕉| free哆拍拍免费永久视频| 久久久久久亚洲精品成人| a级毛片无码免费真人| 免费看黄福利app导航看一下黄色录像 | 亚洲最新在线视频| 国产免费69成人精品视频| 中文成人久久久久影院免费观看| 久久亚洲AV成人无码| 国产在线观看免费视频播放器 | 亚洲黄色免费在线观看| 亚洲精品无码不卡在线播放| 中文字幕亚洲不卡在线亚瑟| 9久9久女女免费精品视频在线观看| 国产精品亚洲av色欲三区| 久久精品视频亚洲| 免费黄色毛片视频| 成人性做爰aaa片免费看|