<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 閱讀(8747) 評論(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)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产精品成人免费视频网站京东| 亚洲国产午夜福利在线播放 | 亚洲国产精品乱码在线观看97| 久久久久久免费视频| 国产AV日韩A∨亚洲AV电影| 日韩va亚洲va欧洲va国产| 国产精品视频免费| 黄色三级三级三级免费看| 亚洲成色999久久网站| 免费的涩涩视频在线播放| a级片免费在线播放| 亚洲卡一卡二卡乱码新区| 国产L精品国产亚洲区久久| 免费观看黄色的网站| 人人公开免费超级碰碰碰视频| 久久亚洲AV无码精品色午夜 | 一本岛高清v不卡免费一三区| 污污视频免费观看网站| 亚洲伊人久久大香线蕉苏妲己| 国产v片免费播放| 久久www免费人成看片| 二级毛片免费观看全程| 91亚洲自偷在线观看国产馆| 亚洲一区二区三区在线播放| 搡女人真爽免费视频大全| 中文字幕一区二区三区免费视频| 亚洲依依成人亚洲社区| 亚洲av永久无码精品古装片| 国产jizzjizz视频免费看| 国产大片91精品免费观看不卡| 精品一区二区三区免费观看| 亚洲综合激情五月丁香六月| 久久青青草原亚洲AV无码麻豆| 亚洲成人一区二区| 成人免费视频88| 成人免费大片免费观看网站| 日韩免费高清播放器| 一级毛片免费视频网站| 亚洲精品中文字幕无码A片老| 亚洲人成电影在线观看青青| 亚洲高清视频在线观看|