以下提供了CRC16 Modbus在各种主流编程语言中的实现代码,包括查表法和计算法两种方式。点击代码块右上角的按钮可以一键复制代码。
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
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
}
}
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
}
}
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
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
}
> 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协议助手