Crc16 To String

时间:2015-04-28 06:49:32

标签: delphi crc16

我可以将字符串转换为crc16,但我需要将crc16转换为字符串。这可能吗?

function TForm1.CRC_16(Icerik: string): word;
var
  valuehex: word;
  i: integer;
  CRC: word;
Begin
  CRC := 0;
  for i := 1 to length(Icerik) do
  begin
    valuehex := ((ord(Icerik[i]) XOR CRC) AND $0F) * $1081;
    CRC := CRC SHR 4;
    CRC := CRC XOR valuehex;
    valuehex := (((ord(Icerik[i]) SHR 4) XOR LO(CRC)) AND $0F);
    CRC := CRC SHR 4;
    CRC := CRC XOR (valuehex * $1081);
  end;
  CRC_16 := (LO(CRC) SHL 8) OR HI(CRC);
end;

此函数将字符串转换为CRC16。

1 个答案:

答案 0 :(得分:8)

由于Pigeonhole Principle,不可能。为了能够从CRC16转换为字符串,您需要具有从CRC16值集到字符串值集的映射函数。

由于只有65536(2 16 )可能的CRC16值,并且字符串可能具有超过65536个可能的值,因此无法定义1-为了1对应,所以从CRC16转换回字符串是不可能的。

换句话说,CRC16函数的字符串是多对一的:许多不同的字符串映射到相同的CRC16值(即它们都被置于相同的#34; pigeonhole")。因此,如果你只从CRC16值开始,你怎么知道那些许多可能的字符串中哪一个是原始字符串?

一个特殊情况例外是,如果只允许字符串具有一组可能的值,并且集合中的每个值都映射到唯一的CRC16值。在这种情况下,只要您知道可能的字符串值集合,该函数就是可逆的。