firemonkey android crc16结果与delphi for windows不匹配
在两个不同的项目中,我需要使用crc16校验和。一个在windows中,另一个在android中。我使用了一个windows代码,它工作得非常好firemonkey android crc16结果与delphi for windows不匹配,delphi,firemonkey,crc16,Delphi,Firemonkey,Crc16,在两个不同的项目中,我需要使用crc16校验和。一个在windows中,另一个在android中。我使用了一个windows代码,它工作得非常好 showmessage( bin2crc16(HexToBin('1234')) ); //---> 0EC9 这里是winsows使用的函数 function Pow(i, k: Integer): Integer; var j, Count: Integer; begin if k>0 then j:=2
showmessage( bin2crc16(HexToBin('1234')) ); //---> 0EC9
这里是winsows使用的函数
function Pow(i, k: Integer): Integer;
var
j, Count: Integer;
begin
if k>0 then j:=2
else j:=1;
for Count:=1 to k-1 do
j:=j*2;
Result:=j;
end;
function BinToDec(Str: string): Integer;
var
Len, Res, i: Integer;
Error: Boolean;
begin
Error:=False;
Len:=Length(Str);
Res:=0;
for i:=1 to Len do
if (Str[i]='0')or(Str[i]='1') then
Res:=Res+Pow(2, Len-i)*StrToInt(Str[i])
else
begin
//MessageDlg('It is not a binary number', mtInformation, [mbOK], 0);
Error:=True;
Break;
end;
if Error=True then Result:=0
else Result:=Res;
end;
//------------------------------------------------------------------------------
function CRC16CCITT(bytes: array of Byte): Word;
const
polynomial = $1021;
var
crc: Word;
I, J: Integer;
b: Byte;
bit, c15: Boolean;
begin
crc := $FFFF;
for I := 0 to High(bytes) do
begin
b := bytes[I];
for J := 0 to 7 do
begin
bit := (((b shr (7-J)) and 1) = 1);
c15 := (((crc shr 15) and 1) = 1);
crc := crc shl 1;
if ((c15 xor bit) <> false) then crc := crc xor polynomial;
end;
end;
Result := crc and $ffff;
end;
//------------------------------------------------------------------------------
function HexToDec(const Str: string): Integer;
begin
if (Str <> '') and ((Str[1] = '-') or (Str[1] = '+')) then
Result := StrToInt(Str[1] + '$' + Copy(Str, 2, MaxInt))
else
Result := StrToInt('$' + Str);
end;
//------------------------------------------------------------------------------
function bin2crc16(str: string): string;
var
I:integer;
lengthCount : integer;
crcByteArr : array of Byte;
crcOut : Word;
begin
lengthCount := Trunc(length(str)/8);
setlength(crcByteArr , lengthCount );
for I := 0 to lengthCount-1 do
begin
crcByteArr[I] := BinToDec(copy(str, I*8+1, 8));
end;
crcOut := CRC16CCITT(crcByteArr);
result := crcOut.ToHexString;
end;
//------------------------------------------------------------------------------
function HexToBin(Hexadecimal: string): string;
const
BCD: array [0..15] of string =
('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
var
i: integer;
begin
Result := '';
for i := Length(Hexadecimal) downto 1 do
Result := BCD[StrToInt('$' + Hexadecimal[i])] + Result;
end;
下面是android中使用的函数
function BinToDec(Str: string): Integer;
var
Len, Res, i: Integer;
Error: Boolean;
begin
Error:=False;
Len:=Length(Str);
Res:=0;
for i:=0 to Len-1 do
if (Str[i]='0')or(Str[i]='1') then
Res:=Res+Pow(2, Len-i)*StrToInt(Str[i])
else
begin
Error:=True;
Break;
end;
if Error=True then Result:=0
else Result:=Res;
end;
//------------------------------------------------------------------------------
function CRC16CCITT(bytes: array of Byte): Word;
const
polynomial = $1021;
var
crc: Word;
I, J: Integer;
b: Byte;
bit, c15: Boolean;
begin
crc := $FFFF;
for I := 0 to High(bytes) do
begin
b := bytes[I];
for J := 0 to 7 do
begin
bit := (((b shr (7-J)) and 1) = 1);
c15 := (((crc shr 15) and 1) = 1);
crc := crc shl 1;
if ((c15 xor bit) <> false) then crc := crc xor polynomial;
end;
end;
Result := crc and $ffff;
end;
//------------------------------------------------------------------------------
function bin2crc16(str: string): string;
var
I:integer;
lengthCount : integer;
crcByteArr : array of Byte;
crcOut : Word;
begin
lengthCount := Trunc(length(str)/8);
setlength(crcByteArr , lengthCount );
for I := 0 to lengthCount-1 do
begin
crcByteArr[I] := BinToDec(copy(str, I*8, 8));
end;
crcOut := CRC16CCITT(crcByteArr);
result := crcOut.ToHexString;
end;
//-----------------------------------------------------------------------------------
function HexToBin(Hexadecimal: string): string;
const
BCD: array [0..15] of string =
('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
var
i: integer;
begin
Result := '';
for i := Length(Hexadecimal)-1 downto 0 do
Result := BCD[StrToInt('$' + Hexadecimal[i])] + Result;
end;
//---------------------------------------------------------------------------------
function Pow(i, k: Integer): Integer;
var
j, Count: Integer;
begin
if k>0 then j:=2
else j:=1;
for Count:=1 to k-1 do
j:=j*2;
Result:=j;
end;
函数BinToDec(Str:string):整数;
变量
Len,Res,i:整数;
错误:布尔;
开始
错误:=假;
Len:=长度(Str);
Res:=0;
对于i:=0到Len-1 do
如果(Str[i]='0')或(Str[i]='1'),则
Res:=Res+Pow(2,Len-i)*stroint(Str[i])
其他的
开始
错误:=真;
打破
结束;
如果Error=True,则结果:=0
其他结果:=Res;
结束;
//------------------------------------------------------------------------------
函数CRC16CCITT(字节:字节数组):字;
常数
多项式=1021美元;
变量
crc:字;
一、 J:整数;
b:字节;
位,c15:布尔值;
开始
crc:=$FFFF;
对于I:=0到高(字节)do
开始
b:=字节[I];
对于J:=0到7 do
开始
位:=((b shr(7-J))和1)=1;
c15:=((crc shr 15)和1)=1);
crc:=crc shl 1;
如果((c15异或位)为假,则crc:=crc异或多项式;
结束;
结束;
结果:=crc和$ffff;
结束;
//------------------------------------------------------------------------------
函数bin2crc16(str:string):string;
变量
I:整数;
长度计数:整数;
crcByteArr:字节数组;
字;
开始
长度计数:=Trunc(长度(str)/8);
设置长度(crcByteArr、lengthCount);
对于I:=0到lengthCount-1do
开始
crcByteArr[I]:=BinToDec(copy(str,I*8,8));
结束;
crcOut:=CRC16CCITT(crcByteArr);
结果:=crcOut.ToHexString;
结束;
//-----------------------------------------------------------------------------------
函数HexToBin(十六进制:string):string;
常数
BCD:字符串的数组[0..15]=
('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
变量
i:整数;
开始
结果:='';
对于i:=长度(十六进制)-1到0 do
结果:=BCD[stroint('$'+十六进制[i])]+结果;
结束;
//---------------------------------------------------------------------------------
函数Pow(i,k:整数):整数;
变量
j、 计数:整数;
开始
如果k>0,则j:=2
否则j:=1;
对于计数:=1到k-1 do
j:=j*2;
结果:=j;
结束;
我怎样才能解决我的问题 您尚未调整长度为零的字符串的HexToBin函数 BinToDec函数中也存在一个问题。您的幂计算错误,因为字符串的索引已更改。处理它的最简单方法可能如下所示,尽管您也可以在POW函数中调整索引
function BinToDec(Str: string): Integer;
var
Len, Res, i: Integer;
Error: Boolean;
begin
Error:=False;
Len:=Length(Str);
Res:=0;
for i:=1 to Len do
if (Str[I - 1]='0')or(Str[I - 1]='1') then
Res:=Res+Pow(2, Len-i)*StrToInt(Str[I - 1])
else
begin
Error:=True;
Break;
end;
if Error=True then Result:=0
else Result:=Res;
end;
最后要注意的是,“复制”使用基于一的索引,即使是基于零的字符串,但您假设它是零索引的。我同意这令人困惑,但确实如此。请不要包含外部链接。将您的代码粘贴到问题中。@Dsm post已更新。我更改了该行,但毫无帮助。它是否给出了不同的结果?是的,结果已更改,但与windows不匹配!值已更改,但windows的值仍不相同!当我使用
1234
作为输入窗口时,会显示0E39
,但您的代码输出是CB65
。请注意我的编辑-重新复制命令。无论在何处使用copy,都需要更改所有开始索引。
function BinToDec(Str: string): Integer;
var
Len, Res, i: Integer;
Error: Boolean;
begin
Error:=False;
Len:=Length(Str);
Res:=0;
for i:=1 to Len do
if (Str[I - 1]='0')or(Str[I - 1]='1') then
Res:=Res+Pow(2, Len-i)*StrToInt(Str[I - 1])
else
begin
Error:=True;
Break;
end;
if Error=True then Result:=0
else Result:=Res;
end;