crc命令是计算8/16/32字节CRC的系统命令形式如下。
此命令的返还值是计算的CRC值。
参数 | 说明 |
---|---|
bits | 8 - 8 bits CRC 16 - 16 bits CRC 32 - 32 bits CRC |
$msg | 需要计算CRC的原本数据 |
init | CRC初始值 省略此项目基本值为: 8 bits - ff, 16 bits - 1d0f, 32 bits - ffffffff |
div | 是计算CRC时使用的divisor(polynomial)。 忽略此项目时基本值是: 8 bits - e0, 16 bits - 1021, 32 bits - edb88320 |
msb/lsb | 是CRC计算顺序。 msb是按byte数据的上位->下位字节顺序计算, lsb是按下位->上位顺序计算。 省略时基本值是I 8 bits - lsb, 16 bits - msb, 32bits - lsb |
下面是各个CRC类型计算CRC的代码示例。
<?php
$string = "123456789";
printf("CRC-16-ANSI : %04x\r\n", (int)system("crc 16 %1 0000 a001 lsb", $string));
printf("CRC-16-Modbus : %04x\r\n", (int)system("crc 16 %1 ffff a001 lsb", $string));
printf("CRC-CCITT FFFF: %04x\r\n", (int)system("crc 16 %1 ffff 1021 msb", $string));
printf("CRC-CCITT 1D0F: %04x\r\n", (int)system("crc 16 %1 1d0f 1021 msb", $string));
printf("CRC-CCITT XModem : %04x\r\n", (int)system("crc 16 %1 0000 1021 msb", $string));
$crc16_out = (int)system("crc 16 123456789 %1 8408 lsb", $string);
$crc16_out = bin2int(int2bin($crc16_out, 2, true), 0, 2);
printf("CRC-CCITT Kermit : %04x\r\n", $crc16_out);
$crc16_out = (int)system("crc 16 123456789 ffff 8408 lsb");
$crc16_out = $crc16_out ^ 0xffff;
printf("CRC-CCITT PPP : %04x\r\n", $crc16_out);
$crc16_out = ~(int)system("crc 16 %1 0000 a6bc lsb", $string);
$crc16_out = bin2int(int2bin($crc16_out, 2, true), 0, 2);
printf("CRC-16-DNP : %04x\r\n", $crc16_out);
?>