当前位置:   article > 正文

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

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];%将高低位合并输出

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

使用该函数时,输入为如下格式:

input=[‘24’;‘5F’;‘61’]
BCCoutput=BCC(input);

可以得到结果输出为1A,如下:
BCC校验位计算结果

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/728069
推荐阅读
相关标签
  

闽ICP备14008679号