firemonkey android crc16结果与delphi for 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

在两个不同的项目中,我需要使用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
    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;