通过串口调试工具分别读到以下五条数据,其中(30,31,32,33,34)是比较有规律的递增的,但是(81,80,83,82,85)毫无规律,不知道是怎么计算出来的,请大侠帮忙,万分感谢!FA 80 31 30 30 30 34 05 00 01 30 81 FC
FA 80 31 30 30 30 34 05 00 01 31 80 FC
FA 80 31 30 30 30 34 05 00 01 32 83 FC
FA 80 31 30 30 30 34 05 00 01 33 82 FC
FA 80 31 30 30 30 34 05 00 01 34 85 FC
FA 80 31 30 30 30 34 05 00 01 31 80 FC
FA 80 31 30 30 30 34 05 00 01 32 83 FC
FA 80 31 30 30 30 34 05 00 01 33 82 FC
FA 80 31 30 30 30 34 05 00 01 34 85 FC
// 16位CRC:按位计算,速度最慢,占用空间最少
// 注:数据流是高位先行
///////////////////////////////////////////////////////////
function CalCRC16(data, crc, genpoly: Word): Word;
var i: Integer;
begin
// 方法1:摘自XMODEM协议
crc := crc xor data;//(data shl 8);
for i:=0 to 7 do
if (crc and $0001) <> 0 then // 只测试最高位
crc := (crc shr 1) xor genpoly // 最高位为1,移位和异或处理
else crc := crc shr 1; // 否则只移位(乘2)
Result := crc;
{
// 方法2:算法有些不同,但结果相同
data := data shl 8; // 移到高字节
for i:=7 downto 0 do
begin
if ((data xor crc) and $8000) <> 0 then // 只测试最高位
crc := (crc shl 1) xor genpoly // 最高位为1,移位和异或处理
else crc := crc shl 1; // 否则只移位(乘2)
data := data shl 1; // 处理下一位
end;
Result := crc; // 方法3:摘自<<CRC算法原理及C语言实现>>
for i:=7 downto 0 do
begin
if (crc and $8000) <> 0 then
crc := (crc*2) xor genpoly // 余式CRC乘以2再求CRC
else crc := crc*2;
if (data and (1 shl i)) <> 0 then
crc := crc xor genpoly; // 再加上本位的CRC
end;
Result := crc;
}
请大侠给给一下c++ builder能直接用的代码啊,万分感谢!
最好能将数据 FA 80 31 30 30 30 34 05 00 01 30 81 FC ,中的红色81直接算出来,其他数据也通过该算法得出,多谢!多谢!
在C++ builder中直接编译pas文件生成hpp就可以了。
打开Win7计算器,设置成程序员模式,显示为字节。复制下行到计算器就得得到结果
80^31^30^30^30^34^05^00^01^31=
FA 80 31 30 30 30 34 05 00 01 31 80 FC
FA 80 31 30 30 30 34 05 00 01 32 83 FC
FA 80 31 30 30 30 34 05 00 01 33 82 FC
FA 80 31 30 30 30 34 05 00 01 34 85 FC FA 80 31 30 30 30 34 05 00 01 35 84 FC==>? FA 80 31 30 30 30 34 05 00 01 36 87 FC==>
FA 80 31 30 30 30 34 05 00 01 37 86 FC==>
所以别人是无法给你直接算出结果的