PHP 十六进制 异或校验码生成
基于网络上分享的方法改进 网上方法部分地位数值会出错
BCC(Block Check Character/信息组校验码),因校验码是将所有数据异或得出,故俗称异或校验。具体算法是:将每一个字节的数据(一般是两个16进制的字符)进行异或后即得到校验码。
例如16进制数据:01 A0 7C FF 02
计算:01 xor A0 xor 7C xor FF xor 02 = 20
校验码是:20
//hex数据BBC异或校验(两两比较)
function hexXor($hex1, $hex2){
$bin1 = str_pad(base_convert($hex1, 16, 2),16,”0″,STR_PAD_LEFT);
$bin2 = str_pad(base_convert($hex2, 16, 2),16,”0″,STR_PAD_LEFT);
$result = ”;
for ($i=0; $i < 16; $i++) {
$result .= $bin1[$i] == $bin2[$i] ? ‘0’ : ‘1’;
}
return base_convert($result, 2, 16);
}
//hex数据BBC异或校验 $str为需要校验的字符串
function hexXorArr($str){
$data=array();
if(strlen($str)%2==0){
for($i=0;$i<strlen($str);$i=$i+2){
$data[]=substr($str,$i,2);
}
}
$result = $data[0];
for ($j=0; $j < count($data)-1; $j++) {
$result = hexXor($result, $data[$j+1]);
}
return $result;
}