赞
踩
BCC异或校验算法较常用于数据包发送中校验位的计算,其方法是依次对前面的每个数进行按位异或,然后组合成一个新的数作为下一个字节的数据。
这里举例说明:
要发送的数据包如下:
24 5F 61
注意:这三个数都是16进制的,即每个数占用1字节;即为0x24, 0x5F, 0x61;
下一字节数据为前三个字节数据BCC校验位
首先将这三个数转变为二进制
24: 0010 0100
5F: 0101 1111
61: 0110 0001
首先对24和5F进行按位异或计算:
0010 0100
0101 1111
—————
0111 1011
之后再与61进行按位异或计算:
0111 1011
0110 0001
—————
0001 1010
故最后这三个16进制一字节的数据的异或校验位为1A。
Matlab中并没有现成的BCC算法的函数,且网上并没有找到BCC算法的Matlab实现,于是尝试自己编写,在编写中发现主要涉及进制转换和数据类型转换,故在这里记录下来,直接放出函数:
function [ outputDec ] = BCC( inputDec ) %UNTITLED 此处显示有关此函数的摘要 % 此处显示详细说明 %进行BCC异或校验 %输入为16进制字符串 %输出为1字节16进制 inputDec1=inputDec(:,1); inputDec2=inputDec(:,2); tempNum=uint8(dec2bin(hex2dec(inputDec1(1)),4)); %将第一个数赋值给tempNum for i=1:(length(inputDec1)-1) tempNum=bitxor(tempNum,uint8(dec2bin(hex2dec(inputDec1(i+1)),4))); %与下一个16进制数值异或 end if mod(length(inputDec1), 2) ~= 0 tempNum=char(tempNum); else tempNum=num2str(tempNum); end hex1=dec2hex(bin2dec(tempNum)); %获得16进制数高位 tempNum=uint8(dec2bin(hex2dec(inputDec2(1)),4)); %将第一个数赋值给tempNum for i=1:(length(inputDec2)-1) tempNum=bitxor(tempNum,uint8(dec2bin(hex2dec(inputDec2(i+1)),4))); %与下一个16进制数值异或 end if mod(length(inputDec2), 2) ~= 0 tempNum=char(tempNum); else tempNum=num2str(tempNum); end hex2=dec2hex(bin2dec(tempNum)); %获得16进制数低位 outputDec=[hex1 hex2];%将高低位合并输出
使用该函数时,输入为如下格式:
input=[‘24’;‘5F’;‘61’]
BCCoutput=BCC(input);
可以得到结果输出为1A,如下:
虽然目前有很多现成的校验位计算器,但是当要发送的数据不是定值时,仍然需要通过函数对校验位进行计算,以上主要为大家提供一个在Matlab环境下可用的BCC校验位计算函数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。