php hex16进制数据 BBC异或值计算

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

php hexdec()与dechex()十六进制转换为十进制互换

jquery中文网为您提供php hexdec()与dechex()十六进制转换为十进制互换等资源,欢迎您收藏本站,我们将为您提供最新的php hexdec()与dechex()十六进制转换为十进制互换资源

hexdec() 函数把十六进制转换为十进制。

语法
hexdec(hex_string)

<blockquote>echo hexdec(’77’);       //输出119
echo “<br>”;
echo hexdec(dechex(43));      //输出43
echo “<br>”;
echo hexdec(‘3a’);       //输出58</blockquote>
dechex() 函数把十进制转换为十六进制。

语法
dechex(dec_number)