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;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傅先生的傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值