成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java CRC16 MODBUS校驗算法實現(xiàn)

mindwind / 2004人閱讀

CRC16 MODBUS校驗算法,分兩種情況,一是參數(shù)是字符串,二是參數(shù)是字節(jié)數(shù)組。
參考文章1
參考文章2
直接上代碼,第一種參數(shù)是字符串

public static void main(String[] args) throws IOException {
    String frame = "01 03 01 48 00 0c";
    System.out.println(getCRC(frame));
}

public static String getCRC(String data) {
    data = data.replace(" ", "");
    int len = data.length();
    if (!(len % 2 == 0)) {
        return "0000";
    }
    int num = len / 2;
    byte[] para = new byte[num];
    for (int i = 0; i < num; i++) {
        int value = Integer.valueOf(data.substring(i * 2, 2 * (i + 1)), 16);
        para[i] = (byte) value;
    }
    return getCRC(para);
}

/**
 * 計算CRC16校驗碼
 *
 * @param bytes
 *            字節(jié)數(shù)組
 * @return {@link String} 校驗碼
 * @since 1.0
 */
public static String getCRC(byte[] bytes) {
    // CRC寄存器全為1
    int CRC = 0x0000ffff;
    // 多項式校驗值
    int POLYNOMIAL = 0x0000a001;
    int i, j;
    for (i = 0; i < bytes.length; i++) {
        CRC ^= ((int) bytes[i] & 0x000000ff);
        for (j = 0; j < 8; j++) {
            if ((CRC & 0x00000001) != 0) {
                CRC >>= 1;
                CRC ^= POLYNOMIAL;
            } else {
                CRC >>= 1;
            }
        }
    }
    // 結果轉換為16進制
    String result = Integer.toHexString(CRC).toUpperCase();
    if (result.length() != 4) {
        StringBuffer sb = new StringBuffer("0000");
        result = sb.replace(4 - result.length(), 4, result).toString();
    }
    //高位在前地位在后
    //return result.substring(2, 4) + " " + result.substring(0, 2);
    // 交換高低位,低位在前高位在后
    return result.substring(2, 4) + " " + result.substring(0, 2);
}

執(zhí)行后結果:

第二種參數(shù)是byte數(shù)組:

public static void main(String[] args) throws IOException {
    byte[] bytes = new byte[] { 0x01, 0x03, 0x01, 0x48, 0x00, 0x0c };
    System.out.println(getCRC2(bytes));
}

public static String getCRC2(byte[] bytes) {
    int CRC = 0x0000ffff;
    int POLYNOMIAL = 0x0000a001;

    int i, j;
    for (i = 0; i < bytes.length; i++) {
        CRC ^= (int) bytes[i];
        for (j = 0; j < 8; j++) {
            if ((CRC & 0x00000001) == 1) {
                CRC >>= 1;
                CRC ^= POLYNOMIAL;
            } else {
                CRC >>= 1;
            }
        }
    }
    // 交換高低位,低位在前高位在后
    CRC = ((CRC & 0x0000FF00) >> 8) | ((CRC & 0x000000FF) << 8);
    String result = Integer.toHexString(CRC);
    return result.substring(0, 2) + " " + result.substring(2, 4);
}

運行結果:

小菜一枚,不正確之處還請各位指教!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/74812.html

相關文章

  • 【RISC-V MCU 創(chuàng)新應用】一種網(wǎng)絡型單相智能電表

    摘要:負責對電能檢測模塊下發(fā)收集指令,以及對電能檢測模塊響應的數(shù)據(jù)進行處理,一方面對接收的單相數(shù)據(jù)進行轉換后驅動屏幕對相關數(shù)據(jù)進行顯示,另一方面對單相數(shù)據(jù)進行重新打包并通過串口對以太網(wǎng)模塊進行數(shù)據(jù)傳輸。 ...

    rockswang 評論0 收藏0
  • java.util.zip.CRC32和java.util.zip.Adler32的性能對比分析

    摘要:當主機正在從某個輸入流源源不斷地讀取文件時,校驗碼的計算是實時的,每次校驗操作都只對文件的一部分進行處理。在計算校驗碼時,請至少使用的分區(qū)大小,否則調用會造成不可忽略的時間消耗。 原文:java.util.zip.CRC32 and java.util.zip.Adler32 performance作者:Mikhail Vorontsov 校驗碼是把任意長度的字節(jié)內容輸入通過特定算法變...

    ISherry 評論0 收藏0
  • Java–串口之間的通信及掃描槍的讀取

    摘要:串口通信以自己剛做的功能做為核心記錄這篇博客是基于通信協(xié)議之間的通信是十六進制進行通信的可選波特率,數(shù)據(jù)位停止位采用校驗功能和代碼的實現(xiàn)界面是用窗體表現(xiàn)的界面的實現(xiàn)就不過多的貼代碼和說怎么去實現(xiàn)了,有個很好用的工具,可以直接拖控件,跟做很像 串口通信以自己剛做的功能做為核心記錄這篇博客①. 是基于modbus通信協(xié)議之間的通信②. 是十六進制進行通信的③. 可選波特率,數(shù)據(jù)位 停止位④...

    EsgynChina 評論0 收藏0
  • 通過PHP實現(xiàn)一致性哈希算法

    摘要:通過虛擬節(jié)點優(yōu)化一致性算法為了提高一致性算法的平衡性,我們首先能夠想到的是,增加節(jié)點數(shù),但是機器畢竟是需要經費啊,不是說增就能隨意增,那就增加虛擬節(jié)點,這樣就沒毛病了。 一、案例分析(1)問題概述 假設我們的圖片數(shù)據(jù)均勻的分配在三臺服務(分別標注為服務器A,服務器B、服務器C)上面,現(xiàn)在我們要從里面取圖片,服務端在拿到這個請求后,怎么會指定,這張圖片是存在服務器A、服務器B,還是服務器...

    tulayang 評論0 收藏0

發(fā)表評論

0條評論

mindwind

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<