<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)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 67194成手机免费观看| 一级毛片试看60分钟免费播放| 久久精品电影免费动漫| 亚洲三区在线观看无套内射| 另类小说亚洲色图| 免费人成年轻人电影| 日韩电影免费在线观看网址 | 96免费精品视频在线观看| 亚洲码国产精品高潮在线| 色www永久免费| 久久青草亚洲AV无码麻豆| 午夜视频免费在线观看| 337p日本欧洲亚洲大胆色噜噜| 99久久免费看国产精品| 亚洲欧洲国产综合| 免费看的成人yellow视频| 成a人片亚洲日本久久| 亚洲另类少妇17p| 伊人久久大香线蕉免费视频| 亚洲AV乱码久久精品蜜桃| 国产免费丝袜调教视频| 亚洲一久久久久久久久| 亚洲国产精品自在拍在线播放| 国产精品九九久久免费视频 | 亚洲精品国产情侣av在线| 在线观看免费人成视频色| 久久精品国产亚洲AV未满十八| 一区二区三区亚洲视频| 国产婷婷成人久久Av免费高清| 亚洲国产成人手机在线电影bd| 免费看a级黄色片| 中国人免费观看高清在线观看二区| 亚洲精品高清久久| 性感美女视频在线观看免费精品| 亚洲AⅤ男人的天堂在线观看| 亚洲中久无码永久在线观看同| 狼群影院在线观看免费观看直播| 亚洲av无码一区二区三区人妖| 国产AV无码专区亚洲Av| 毛片A级毛片免费播放| 国产做国产爱免费视频|