<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 閱讀(8746) 評論(2)  編輯  收藏 所屬分類: JAVA

    評論

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

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

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

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

    <2011年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲综合国产成人丁香五月激情 | 亚洲av日韩av欧v在线天堂| 亚洲中文无码线在线观看| 久久成人免费大片| 久久久久亚洲精品成人网小说| 99精品全国免费观看视频..| 亚洲码国产精品高潮在线| 182tv免费视频在线观看| 久久精品国产亚洲AV无码偷窥| 一级毛片免费观看不卡的| 久久久婷婷五月亚洲97号色| 日韩欧毛片免费视频| 亚洲不卡影院午夜在线观看| 四虎影院免费视频| 国产成人亚洲精品无码AV大片| 国产一区二区三区在线免费观看| 国产综合成人亚洲区| 国产亚洲精品AA片在线观看不加载| 国产精品免费久久| 91精品国产亚洲爽啪在线影院| 免费看片在线观看| 国产精品亚洲一区二区在线观看| 亚洲A丁香五香天堂网| 国产午夜无码精品免费看| 亚洲理论精品午夜电影| 午夜毛片不卡高清免费| 一级特黄aaa大片免费看| 亚洲a在线视频视频| 日韩一区二区a片免费观看 | 九月丁香婷婷亚洲综合色| 免费A级毛片av无码| 亚洲人成无码网站在线观看| 亚洲国产精品综合久久网络| 四虎国产成人永久精品免费| 久久乐国产综合亚洲精品| 国产综合精品久久亚洲| 午夜性色一区二区三区免费不卡视频 | 亚洲AV无码乱码在线观看| 日韩视频免费在线观看| 亚洲伊人久久大香线蕉AV| 狠狠综合久久综合88亚洲|