簡體   English   中英

計算低字節和高字節CRC16-Java

[英]Calculate low and high bytes CRC16 - Java

我遇到了CRC16算法的問題。 有一個十六進制的字符串80 01 F0,在CRC16之后,我得到低字節= 23而高字節=80。那么,問題是如何計算這兩個字節? 我嘗試了CRC計算器,但沒有結果。 另外,如果在Java中有此方法的示例,那將是完美的。 在手冊中還有其他信息:使用在所有字節上計算的多項式(X16 + X15 + X2 + 1)的正向CRC-16算法的低字節和高字節。 它使用種子0xFFFF初始化。

感謝您的回應。 我相信我的回答將對其他人有用。 經過測試的工作代碼。

    private static byte[] getCRC16LowHighBytes(byte[] byteSequence) {
    // Create a byte array for Low and High bytes
    byte[] returnBytes = new byte[2];
    int crc = CRC16_SEED;
    for (int i = 0; i < byteSequence.length; ++i) {
        crc ^= (byteSequence[i] << 8);
        for (int j = 0; j < 8; ++j) {
            if ((crc & 0x8000) != 0) {
                crc = (crc << 1) ^ CRC16_POLINOM;
            } else {
                crc <<= 1;
            }
        }
    }
    byte[] crcBytes = getBytes(crc);
    // The first two bytes of crcBytes are low and high bytes respectively.
    for (int i = 0; i < returnBytes.length; i++) {
        returnBytes[i] = crcBytes[i];
    }
    return returnBytes;
}

private static byte[] getBytes(int v) {
    byte[] writeBuffer = new byte[4];
    writeBuffer[3] = (byte) ((v >>> 24) & 0xFF);
    writeBuffer[2] = (byte) ((v >>> 16) & 0xFF);
    writeBuffer[1] = (byte) ((v >>> 8) & 0xFF);
    writeBuffer[0] = (byte) ((v >>> 0) & 0xFF);
    return writeBuffer;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM