<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

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

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

    導航

    統計

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产成人久久精品动漫| 久久久久国产成人精品亚洲午夜| 久久精品亚洲一区二区三区浴池 | 亚洲欧美日韩综合久久久久| 免费看国产成年无码AV片| 18亚洲男同志videos网站| 亚洲欧美日韩自偷自拍| 最近的免费中文字幕视频| 精品国产成人亚洲午夜福利| 午夜影视在线免费观看| 亚洲AV无码成人精品区狼人影院| 免费无码又爽又高潮视频 | 亚洲国色天香视频| 四虎国产精品免费久久| 亚洲欧美一区二区三区日产| 又粗又黄又猛又爽大片免费| eeuss影院免费92242部| 成人人观看的免费毛片| 久久精品国产亚洲AV| 亚洲国产精品毛片av不卡在线| 亚洲一卡二卡三卡| 欧美a级成人网站免费| 亚洲国产欧美日韩精品一区二区三区 | 久久亚洲中文无码咪咪爱| 亚洲欧洲久久av| 在线视频亚洲一区| 国产亚洲精品不卡在线| 99久久99久久免费精品小说| 国产亚洲精品无码专区| 91成人在线免费视频| 久久精品亚洲AV久久久无码| vvvv99日韩精品亚洲| 国产精品亚洲专区无码WEB| 亚洲一区二区女搞男| 久久福利资源网站免费看| 国产精品亚洲lv粉色| 亚洲国产a∨无码中文777| 久久不见久久见中文字幕免费| 小说区亚洲自拍另类| 亚洲AV无码久久精品色欲| 最近免费中文字幕大全视频|