加密后的数据转换为字符串,一般可以用base64编码,也可以转换为16进制的字符显示。转换后的体积base64编码的会比16进制字符串更小一些。
由于原先系统是用的16进制字符,为兼容考虑所以继续用16进制字符。在数据量小的时候没问题,加密解密都很快。
代码如下
function StrToHex(Value: RawByteString): ansistring;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(Value) do
Result := Result + IntToHex(Ord(Value[I]), 2); //速度慢
end;
不过字符数量达到3万,加密后转为16进制字符耗时需要10多秒。跟踪调试发现是Delphi系统自带的IntToHex效率低引起卡顿的。
由于本系统只需简单的将单个字节转为16进制字符,不需考虑integer或者int64数据类型。所以决定用空间换时间,用查表法提高效率。
const
hexTable: array [0..255] of ShortString = (
'00', '01','02', '03', '04', '05', '06', '07', '08','09','0A','0B','0C','0D','0E','0F',
'10', '11','12', '13', '14', '15', '16', '17', '18','19','1A','1B','1C','1D','1E','1F',
'20', '21','22', '23', '24', '25', '26', '27', '28','29','2A','2B','2C','2D','2E','2F',
'30', '31','32', '33', '34', '35', '36', '37', '38','39','3A','3B','3C','3D','3E','3F',
'40', '41','42', '43', '44', '45', '46', '47', '48','49','4A','4B','4C','4D','4E','4F',
'50', '51','52', '53', '54', '55', '56', '57', '58','59','5A','5B','5C','5D','5E','5F',
'60', '61','62', '63', '64', '65', '66', '67', '68','69','6A','6B','6C','6D','6E','6F',
'70', '71','72', '73', '74', '75', '76', '77', '78','79','7A','7B','7C','7D','7E','7F',
'80', '81','82', '83', '84', '85', '86', '87', '88','89','8A','8B','8C','8D','8E','8F',
'90', '91','92', '93', '94', '95', '96', '97', '98','99','9A','9B','9C','9D','9E','9F',
'A0', 'A1','A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8','A9','AA','AB','AC','AD','AE','AF',
'B0', 'B1','B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8','B9','BA','BB','BC','BD','BE','BF',
'C0', 'C1','C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8','C9','CA','CB','CC','CD','CE','CF',
'D0', 'D1','D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8','D9','DA','DB','DC','DD','DE','DF',
'E0', 'E1','E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8','E9','EA','EB','EC','ED','EE','EF',
'F0', 'F1','F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8','F9','FA','FB','FC','FD','FE','FF'
);
然后将最后一句代码改为
Result := Result + hexTable[Ord(Value[I])];
经测试,加密后的转换效率大幅提高。耗时从原先的十多秒优化到0.001秒。