BCC校验
逐字节异或(^)
public byte byteXOR(byte src, byte src1) {
return (byte) ((src & 0xFF) ^ (src1 & 0xFF));
}
/**
* 逐字节异或
* @param src
* @return
*/
public byte bytesXOR(byte[] src) {
byte b = src[0];
Log.e("异或过程", "初始值: " + Integer.toHexString(b & 0xFF)); // 转无符号打印
for(int i=1;i<src.length;i++)
{
b = byteXOR(b,src[i]);
Log.e("异或过程", "第"+i+"次: 与"+Integer.toHexString(src[i] & 0xFF)+"异或 → "+Integer.toHexString(b & 0xFF));
}
return b;
}
LRC 异或校验
逐字节累加(+),最终取反
/**
* LRC(纵向冗余校验):累加所有字节 → 取反(不加1)
* @param src 待校验的字节数组
* @return LRC校验值
*/
public byte calculateLRC(byte[] src) {
int lrc = 0;
// 1. 累加所有字节(转为无符号整数)
for (byte b : src) {
lrc += (b & 0xFF);
lrc &= 0xFF; // 限制在8位(0-255),避免溢出
}
// 2. 取反(~)并转回byte(& 0xFF 确保无符号)
// lrc = (~lrc) & 0xFF;
// 2. 核心修正:取反 + 加1(补码运算),这是和你原代码的唯一区别
lrc = ((~lrc) + 1) & 0xFF;
return (byte) lrc;
}


1万+

被折叠的 条评论
为什么被折叠?



