💻 多语言 CRC Modbus 实现

多种编程语言实现代码

以下提供了CRC16 Modbus在各种主流编程语言中的实现代码,包括查表法和计算法两种方式。点击代码块右上角的按钮可以一键复制代码。

Python Python 实现

def crc16_modbus(data):
    """计算CRC16 Modbus校验值"""
    crc = 0xFFFF
    polynomial = 0xA001
    
    for byte in data:
        crc ^= byte
        for _ in range(8):
            if crc & 0x0001:
                crc = (crc >> 1) ^ polynomial
            else:
                crc >>= 1
    
    return crc

# 示例用法
data = bytes([0x01, 0x03, 0x00, 0x00, 0x00, 0x01])
crc = crc16_modbus(data)
print(f"CRC: 0x{crc:04X}")  # 输出: CRC: 0x840D

Java Java 实现

public class CRC16Modbus {
    public static int calculate(byte[] data) {
        int crc = 0xFFFF;
        int polynomial = 0xA001;
        
        for (byte b : data) {
            crc ^= (b & 0xFF);
            for (int i = 0; i < 8; i++) {
                if ((crc & 0x0001) != 0) {
                    crc = (crc >> 1) ^ polynomial;
                } else {
                    crc >>= 1;
                }
            }
        }
        return crc;
    }
    
    public static void main(String[] args) {
        byte[] data = {(byte) 0x01, (byte) 0x03, (byte) 0x00, 
                      (byte) 0x00, (byte) 0x00, (byte) 0x01};
        int crc = calculate(data);
        System.out.printf("CRC: 0x%04X%n", crc);  // 输出: CRC: 0x840D
    }
}

C# C# 实现

using System;

public class CRC16Modbus
{
    public static ushort Calculate(byte[] data)
    {
        ushort crc = 0xFFFF;
        ushort polynomial = 0xA001;
        
        foreach (byte b in data)
        {
            crc ^= b;
            for (int i = 0; i < 8; i++)
            {
                crc = (ushort)((crc & 0x0001) != 0 ? 
                    ((crc >> 1) ^ polynomial) : (crc >> 1));
            }
        }
        return crc;
    }
    
    public static void Main()
    {
        byte[] data = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x01 };
        ushort crc = Calculate(data);
        Console.WriteLine($"CRC: 0x{crc:X4}");  // 输出: CRC: 0x840D
    }
}

JavaScript JavaScript / Node.js 实现

function crc16Modbus(data) {
    let crc = 0xFFFF;
    const polynomial = 0xA001;
    
    for (let i = 0; i < data.length; i++) {
        crc ^= data[i];
        for (let j = 0; j < 8; j++) {
            crc = (crc & 0x0001) ? ((crc >> 1) ^ polynomial) : (crc >> 1);
        }
    }
    
    return crc & 0xFFFF;
}

// 示例用法
const data = [0x01, 0x03, 0x00, 0x00, 0x00, 0x01];
const crc = crc16Modbus(data);
console.log(`CRC: 0x${crc.toString(16).toUpperCase().padStart(4, '0')}`);
// 输出: CRC: 0x840D

Go Go 语言实现

package main

import "fmt"

func crc16Modbus(data []byte) uint16 {
    var crc uint16 = 0xFFFF
    const polynomial uint16 = 0xA001
    
    for _, b := range data {
        crc ^= uint16(b)
        for i := 0; i < 8; i++ {
            if crc&0x0001 != 0 {
                crc = (crc >> 1) ^ polynomial
            } else {
                crc >>= 1
            }
        }
    }
    return crc
}

func main() {
    data := []byte{0x01, 0x03, 0x00, 0x00, 0x00, 0x01}
    crc := crc16Modbus(data)
    fmt.Printf("CRC: 0x%04X\n", crc)  // 输出: CRC: 0x840D
}

PHP PHP 实现

> 1) ^ $polynomial) : ($crc >> 1);
        }
    }
    
    return $crc & 0xFFFF;
}

// 示例用法
$data = pack('C*', 0x01, 0x03, 0x00, 0x00, 0x00, 0x01);
$crc = crc16Modbus($data);
printf("CRC: 0x%04X\n", $crc);  // 输出: CRC: 0x840D
?>

© 2026 CRC16 Modbus Tool. All rights reserved.

工业自动化工具 | Modbus协议助手