-1

我可以将字符串转换为 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 。

4

1 回答 1

8

不,这是不可能的,因为鸽子洞原理。为了能够从 CRC16 转换为字符串,您需要具有从 CRC16 值集到字符串值集的映射函数。

由于只有 65536 (2 16 ) 个可能的 CRC16 值,并且字符串可以具有的可能值远多于 65536 个,因此无法定义一对一的对应关系,因此将 CRC16 转换回字符串是不可能的。

换句话说,字符串到 CRC16 函数是多对一的:许多不同的字符串映射到相同的 CRC16 值(即它们都被放置在同一个“鸽笼”中)。因此,如果您仅从 CRC16 值开始,您将如何知道这些可能的字符串中的哪一个是原始字符串?

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

于 2015-04-28T07:01:59.160 回答