0

我正在尝试移植一些异或加密代码,因此它不使用任何其他单位。我只想使用编译器本机支持的命令、变量和类型。

例如,这里有一些原始代码:

[...]
while (StreamIn.Position < StreamIn.Size) and
 ((StreamIn.Size -StreamIn.Position) >= szBuffer) do begin
 (* read 4 bytes at a time into a local integer variable *)
 StreamIn.ReadBuffer(buffer, szBuffer);
 (* the XOR encryption/decryption *)
 buffer := buffer xor theKey;
 buffer := buffer xor $E0F;
 (* write data to output stream *)
 StreamOut.WriteBuffer(buffer, szBuffer);
end;
[...]

这是我的代码:

function __NativeEncrypt (const Key, Source : String) : String;
// this function should not be used directly
// use EncryptText and DecryptText
const
 szBuffer = SizeOf(Integer); (* 4 bytes *)
 szByteBuffer = SizeOf(Byte); (* 1 byte *)
var
 byteBuffer,
 buffer,
 index,
 theKey: Integer;
 StreamIn  : String;
 StreamOut : String;
 i : Integer;
begin
 theKey := hashKey(Key);
 StreamIn := Source;
 StreamOut := '';
 for i := 1 to Length (StreamIn) do begin
  buffer := Integer(StreamIn[i]);
  buffer := buffer xor thekey;
  buffer := buffer xor $E0F;
  StreamOut := StreamOut + char(Buffer);
 end;
 result := StreamOut; // wrong results.
 // to continue...
end;

这个任务有什么技巧?

4

1 回答 1

2

不使用图书馆提供的单元的唯一原因是作为学习练习。我认为没有其他理由通过拒绝使用工具的内置功能来故意削弱自己。对您的一般提示请求的任何回答都会剥夺您的学习经验。

大多数开发人员最终会在他们职业生涯的某个阶段从头开始重写一些东西。然而,除非是由患有极端不在这里投资综合症的主管强加的,否则这几乎总是一种个人经历。你不会从他们的经验中获益,就像你从自己做的工作中获益一样。自己动手将使您了解内置工具的作用,并可能让您深入了解为什么它们的设计方式是这样的。尽管您可能能够从其他人那里得到这些解释,但除非您实际上自己尝试过,否则无论如何您都不会真正欣赏这些解释。

我给你的建议是继续你的项目。我希望你觉得它很有趣,我祝你好运。如果您最终发现自己无法取得进一步的进展,请找出您遇到的具体问题,然后向其他人寻求帮助以解决该障碍。

于 2012-09-14T17:05:44.270 回答