1.前言
物联网的通信。想要远程通信,必须要用指定的协议发送给机器才可以实现智能开锁。需要发送的数据是16进制的hex,并且最后一位的数据必须用BBC异或校验得到的数据才行。网上查询了一下php生成BBC异或校验码的相关资料,记录一下
在线效验异或值地址:http://www.metools.info/code/c48.html,
http://www.ip33.com/bcc.html
BBC校验
BCC(Block Check Character/信息组校验码),因校验码是将所有数据异或得出,故俗称异或校验。具体算法是:将每一个字节的数据(一般是两个16进制的字符)进行异或后即得到校验码。
例如16进制数据:01 A0 7C FF 02
计算:01 xor A0 xor 7C xor FF xor 02 = 20
校验码是:20
计算思路
把十六进制的字符按照顺序两个异或之后拿得到的结果再和下一个异或,
hex数据BBC异或校验(两两比较)
/**
* @param $byte1
* @param $byte2
* @return string
* hex数据BBC异或校验(两两比较)
*/
function hexOr($byte1, $byte2)
{
$result='';
$byte1= str_pad(base_convert($byte1, 16, 2), '8', '0', STR_PAD_LEFT);
$byte2= str_pad(base_convert($byte2, 16, 2), '8', '0', STR_PAD_LEFT);
$len1 = strlen($byte1);
for ($i = 0; $i < $len1 ; $i++) {
$result .= $byte1[$i] == $byte2[$i] ? '0' : '1';
}
return strtoupper(base_convert($result, 2, 16));
}
hex数据BBC异或校验(多个hex数据进行校验)
/**
* @param $data
* @return mixed
* hex数据BBC异或校验(多个hex数据进行校验)
*/
function hexOrArr($data)
{
$result = $data[0];
for ($i = 0; $i < count($data) - 1; $i++) {
$result = hexOr($result, $data[$i + 1]);
}
return $result;
}
字符串根据字节长度拆分为数组
/**
* @param $string
* @param int $len
* @return array
* 字符串根据字节长度拆分为数组
*/
function mbStrSplit($string, $len = 1)
{
$start = 0;
$strlen = mb_strlen($string);
while ($strlen) {
$array[] = strtoupper(mb_substr($string, $start, $len, "utf8"));
$string = mb_substr($string, $len, $strlen, "utf8");
$strlen = mb_strlen($string);
}
return $array;
}
$message=01A07CFF02
$sum=hexOrArr(mbStrSplit($message, 2));//异或值
echo $sum;
————————————————
版权声明:本文为CSDN博主「傅先生的傅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44243111/article/details/112593099