如何计算 PHP HEX 中的 CRC16 CCITT?
How to calculate CRC16 CCITT in PHP HEX?
我正在尝试使用 PHP CRC16 CCITT 函数来计算校验和。
一个设备向我发送了一个包含校验和的数据包:
10 00 00 00 00 00 00 00 12 51 09 08 00 18 00 04 02 14 00 0c 00 0c 02
1c 00 02 00 00 00 00 00 00 a0 77
校验和在末尾:a0 77
我试过使用
How to calculate crc16 in php
Convert C to PHP for CRC16 Function
没有成功,CRC 16 计算 return:E6 F4
而不是 a0 77
我得到正确的十六进制信息 returned,当我查找时:
100000000000000012510908001800040214000c000c021c0002000000000000
在网站 http://www.lammertbies.nl/comm/info/crc-calculation.html 上,但我无法复制它。 (确保 select 输入类型为 HEX)
你能帮我弄清楚如何获取十六进制值字符串的 crc16 CCITT
100000000000000012510908001800040214000c000c021c0002000000000000
我正在寻找校验和 a0 77
我能够通过如下实现生成相同的校验和:
define('CRC16POLYN', 0x1021);
function CRC16Normal($buffer) {
$result = 0xFFFF;
if (($length = strlen($buffer)) > 0) {
for ($offset = 0; $offset < $length; $offset++) {
$result ^= (ord($buffer[$offset]) << 8);
for ($bitwise = 0; $bitwise < 8; $bitwise++) {
if (($result <<= 1) & 0x10000) $result ^= CRC16POLYN;
$result &= 0xFFFF;
}
}
}
return $result;
}
echo dechex(CRC16Normal(hex2bin('100000000000000012510908001800040214000c000c021c0002000000000000')));
上面给出了 a077
的输出。
在 https://forums.digitalpoint.com/threads/php-define-function-calculate-crc-16-ccitt.2584389/
上找到的代码片段
我从Deplhi函数中了解到它是如何工作的。它得到一个字节数组,而不是十六进制字符串来完成这项工作。
这是代码:
// $commands = [0x35, 0x02, 0x02, 0x00, 0x10, 0x03]; // => 0x5ba3
$commands = [0x44, 0x02, 0x02, 0x01, 0x10, 0x03]; // => 0x55c0
var_dump(dechex(getChecksum($commands)));
function getChecksum($byteArray) {
$polynom = 0x8408;
$in_crc = 0x0000;
for ($i = 0; $i < sizeof($byteArray); $i++) {
for ($n = 0; $n < 8; $n++) {
if((($byteArray[$i] & 0x0001) ^ $in_crc) & 0x0001)
$in_crc = ($in_crc >> 1) ^ $polynom;
else
$in_crc = $in_crc >> 1;
$byteArray[$i] = $byteArray[$i] >> 1;
}
$result = $in_crc;
}
return $result;
}
解决方案可以在 this 在线 CRC 计算器 上证明。
使用的算法是CRC-16/KERMIT.
所以我一直在寻找如何根据 [ISO/IEC 13239] 使用多项式“1021”(十六进制)和初始值 'FFFF'(十六进制)计算校验和。我发现这个 link 可以计算多种类型的 CRC。提交我的输入后,我想要字段 CRC-CCITT (0xFFFF)
的值,它是这样的:
所以我采用了计算 CCITT 的 JS 函数(在 .js file 中,函数名称是 CRCFFFF
),并创建了它的 PHP 版本。
function crcChecksum($str) {
// The PHP version of the JS str.charCodeAt(i)
function charCodeAt($str, $i) {
return ord(substr($str, $i, 1));
}
$crc = 0xFFFF;
$strlen = strlen($str);
for($c = 0; $c < $strlen; $c++) {
$crc ^= charCodeAt($str, $c) << 8;
for($i = 0; $i < 8; $i++) {
if($crc & 0x8000) {
$crc = ($crc << 1) ^ 0x1021;
} else {
$crc = $crc << 1;
}
}
}
$hex = $crc & 0xFFFF;
$hex = dechex($hex);
$hex = strtoupper($hex);
return $hex;
}
$result = crcChecksum('replace with your string here');// In my case, this gave me the desired output, which is '627B' (without '0x')
如果您需要“0x”,只需添加它:
$result = '0x' . crcChecksum('replace with your string here');// result = '0x627B'
我正在尝试使用 PHP CRC16 CCITT 函数来计算校验和。
一个设备向我发送了一个包含校验和的数据包:
10 00 00 00 00 00 00 00 12 51 09 08 00 18 00 04 02 14 00 0c 00 0c 02 1c 00 02 00 00 00 00 00 00 a0 77
校验和在末尾:a0 77
我试过使用
How to calculate crc16 in php
Convert C to PHP for CRC16 Function
没有成功,CRC 16 计算 return:E6 F4
而不是 a0 77
我得到正确的十六进制信息 returned,当我查找时:
100000000000000012510908001800040214000c000c021c0002000000000000
在网站 http://www.lammertbies.nl/comm/info/crc-calculation.html 上,但我无法复制它。 (确保 select 输入类型为 HEX)
你能帮我弄清楚如何获取十六进制值字符串的 crc16 CCITT
100000000000000012510908001800040214000c000c021c0002000000000000
我正在寻找校验和 a0 77
我能够通过如下实现生成相同的校验和:
define('CRC16POLYN', 0x1021);
function CRC16Normal($buffer) {
$result = 0xFFFF;
if (($length = strlen($buffer)) > 0) {
for ($offset = 0; $offset < $length; $offset++) {
$result ^= (ord($buffer[$offset]) << 8);
for ($bitwise = 0; $bitwise < 8; $bitwise++) {
if (($result <<= 1) & 0x10000) $result ^= CRC16POLYN;
$result &= 0xFFFF;
}
}
}
return $result;
}
echo dechex(CRC16Normal(hex2bin('100000000000000012510908001800040214000c000c021c0002000000000000')));
上面给出了 a077
的输出。
在 https://forums.digitalpoint.com/threads/php-define-function-calculate-crc-16-ccitt.2584389/
上找到的代码片段我从Deplhi函数中了解到它是如何工作的。它得到一个字节数组,而不是十六进制字符串来完成这项工作。 这是代码:
// $commands = [0x35, 0x02, 0x02, 0x00, 0x10, 0x03]; // => 0x5ba3
$commands = [0x44, 0x02, 0x02, 0x01, 0x10, 0x03]; // => 0x55c0
var_dump(dechex(getChecksum($commands)));
function getChecksum($byteArray) {
$polynom = 0x8408;
$in_crc = 0x0000;
for ($i = 0; $i < sizeof($byteArray); $i++) {
for ($n = 0; $n < 8; $n++) {
if((($byteArray[$i] & 0x0001) ^ $in_crc) & 0x0001)
$in_crc = ($in_crc >> 1) ^ $polynom;
else
$in_crc = $in_crc >> 1;
$byteArray[$i] = $byteArray[$i] >> 1;
}
$result = $in_crc;
}
return $result;
}
解决方案可以在 this 在线 CRC 计算器 上证明。 使用的算法是CRC-16/KERMIT.
所以我一直在寻找如何根据 [ISO/IEC 13239] 使用多项式“1021”(十六进制)和初始值 'FFFF'(十六进制)计算校验和。我发现这个 link 可以计算多种类型的 CRC。提交我的输入后,我想要字段 CRC-CCITT (0xFFFF)
的值,它是这样的:
所以我采用了计算 CCITT 的 JS 函数(在 .js file 中,函数名称是 CRCFFFF
),并创建了它的 PHP 版本。
function crcChecksum($str) {
// The PHP version of the JS str.charCodeAt(i)
function charCodeAt($str, $i) {
return ord(substr($str, $i, 1));
}
$crc = 0xFFFF;
$strlen = strlen($str);
for($c = 0; $c < $strlen; $c++) {
$crc ^= charCodeAt($str, $c) << 8;
for($i = 0; $i < 8; $i++) {
if($crc & 0x8000) {
$crc = ($crc << 1) ^ 0x1021;
} else {
$crc = $crc << 1;
}
}
}
$hex = $crc & 0xFFFF;
$hex = dechex($hex);
$hex = strtoupper($hex);
return $hex;
}
$result = crcChecksum('replace with your string here');// In my case, this gave me the desired output, which is '627B' (without '0x')
如果您需要“0x”,只需添加它:
$result = '0x' . crcChecksum('replace with your string here');// result = '0x627B'