我可以将字符串转换为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。
答案 0 :(得分:8)
由于Pigeonhole Principle,不可能。为了能够从CRC16转换为字符串,您需要具有从CRC16值集到字符串值集的映射函数。
由于只有65536(2 16 )可能的CRC16值,并且字符串可能具有超过65536个可能的值,因此无法定义1-为了1对应,所以从CRC16转换回字符串是不可能的。
换句话说,CRC16函数的字符串是多对一的:许多不同的字符串映射到相同的CRC16值(即它们都被置于相同的#34; pigeonhole")。因此,如果你只从CRC16值开始,你怎么知道那些许多可能的字符串中哪一个是原始字符串?
一个特殊情况例外是,如果只允许字符串具有一组可能的值,并且集合中的每个值都映射到唯一的CRC16值。在这种情况下,只要您知道可能的字符串值集合,该函数就是可逆的。