用c编写CRC-16-CCITT
时间: 2023-05-22 21:06:06 浏览: 149
以下是用C语言编写CRC-16-CCITT的示例代码:
```c
#define CRC16_CCITT 0x1021
unsigned short crc16_ccitt(const unsigned char *buf, int len)
{
unsigned short crc = 0xFFFF;
for (int i = 0; i < len; i++)
{
crc ^= (unsigned short)buf[i] << 8;
for (int j = 0; j < 8; j++)
{
if (crc & 0x8000)
{
crc = (crc << 1) ^ CRC16_CCITT;
}
else
{
crc <<= 1;
}
}
}
return crc;
}
```
这个函数的作用是计算CRC-16-CCITT校验码,输入参数是一个unsigned char类型的指针和一个int类型的长度值,输出结果是一个unsigned short类型的校验码。函数中使用了位操作和循环来实现CRC校验算法,并且采用了CRC-CCITT多项式0x1021作为生成多项式。
相关问题
PHP编写modbus,php – CRC-CCITT转CRC16 Modbus实现
要在PHP中编写Modbus,需要使用PHP的串口扩展或MODBUS TCP/IP库。下面是一个使用MODBUS TCP/IP库的示例,实现CRC-CCITT转CRC16 Modbus。
```php
<?php
// Modbus TCP/IP库
require_once('modbus-master-php/ModbusMaster.php');
// 定义Modbus地址
$address = 0;
// 创建ModbusMaster实例
$modbus = new ModbusMaster("192.168.1.1", "TCP");
// 定义数据
$data = array(0x01, 0x02, 0x03, 0x04);
// CRC-CCITT转CRC16 Modbus
$crc = crc16_modbus(pack('C*', ...$data));
// 将CRC16 Modbus转换为字节序列
$crc_bytes = pack('n', $crc);
// 将CRC16 Modbus添加到数据末尾
$data_with_crc = array_merge($data, unpack('C*', $crc_bytes));
// 写入数据到Modbus寄存器
$modbus->writeMultipleRegisters($address, $data_with_crc);
// CRC-CCITT转CRC16 Modbus算法
function crc16_modbus($data) {
$crc = 0xFFFF;
$length = strlen($data);
for ($i = 0; $i < $length; $i++) {
$crc ^= ord($data[$i]);
for ($j = 0; $j < 8; $j++) {
if (($crc & 0x0001) == 0x0001) {
$crc >>= 1;
$crc ^= 0xA001;
} else {
$crc >>= 1;
}
}
}
return $crc;
}
?>
```
以上代码将数据写入Modbus寄存器,并在数据末尾添加CRC16 Modbus校验和。crc16_modbus函数实现了CRC-CCITT转CRC16 Modbus算法。
使用javascript,编写输入16进制字符串通过CRC16-CCITT方法计算出十六进制结果
你可以使用以下代码来计算输入的 16 进制字符串的 CRC16-CCITT 值:
```
function crc16(input) {
var crc = 0xFFFF;
var j, i;
input = input.toUpperCase();
for (i = 0; i < input.length; i++) {
crc = crc ^ input.charCodeAt(i);
for (j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ 0x8408;
} else {
crc = crc >> 1;
}
}
}
return crc.toString(16);
}
// 例如,计算字符串 "HELLO" 的 CRC16-CCITT 值
console.log(crc16("HELLO")); // 输出:"B4C8"
```
上面的代码使用了 16 进制计算,并将结果转换为 16 进制字符串。如果你想要输出十进制数,可以把 `crc.toString(16)` 改为 `crc.toString(10)`。
阅读全文