BCC异或校验及BCC在Matlab中的实现

本文详细介绍BCC异或校验算法的工作原理,并提供了一个在Matlab中的实际实现,包括16进制数据的处理流程和自定义函数BCC的编写。适合数据包开发者理解和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BCC异或校验及BCC在Matlab中的实现

BCC异或校验算法

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。

BCC异或校验算法的MATLAB实现

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,如下:
BCC校验位计算结果

总结

虽然目前有很多现成的校验位计算器,但是当要发送的数据不是定值时,仍然需要通过函数对校验位进行计算,以上主要为大家提供一个在Matlab环境下可用的BCC校验位计算函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值