将C源代码移植到Delphi

时间:2014-07-26 14:56:03

标签: c delphi

目前我正在尝试将用C编写的加密库移植到Delphi。它几乎已经完成,但是C源代码包含了我目前无法应对的以下指令。

unsigned char one_block[16];
unsigned char * iv
((unsigned int *)one_block)[3] = ((unsigned int *) iv)[3];

...

我尝试将其转换为

var
  one_block: Array[0..15] of Byte;
  iv : PByte;
begin
  PDWord(one_block[3]):= PDWord(iv[3]);
  ...
end; 

但显然无法编译,因为无法分配表达式的左侧。

任何有更多移植练习的人都可以给我一个如何解决这个问题的提示吗? 提前谢谢。

2 个答案:

答案 0 :(得分:4)

尝试以下方法:

{$POINTERMATH ON}
PCardinal(@one_block)[3] := PCardinal(iv)[3]; // fills bytes 12..15 of one_block

正如评论所说,我假设C代码以某种方式初始化iv,并设置one_block的其他部分。你没有表现出来。

现在,如果你的Delphi版本不支持$POINTERMATH,那么你必须这样做:

type
  PCardinalArray = ^TCardinalArray;
  TCardinalArray = array[0..3] of Cardinal;

  ...

  PCardinalArray(@one_block)^[3] := PCardinalArray(iv)^[3];

答案 1 :(得分:1)

PDWord(one_block)[3] := PDWord(iv)[3]; 

...如果Pascal / Delphi可以将PDWord用作数组 1.施放(更改阵列的类型)。
2.访问数组(ints / dwords)。

编辑:

嗯,IV和BLOCK应该用作

array[0..3] of Integer (or DWord)

......因为看起来你正在使用AES-128

所以,你应该声明

TBlock = array[0..3] of Integer/Dword
PBlock = ^TBlock

并以这种方式施展

PBlock(@block)^[3] = PBlock(@iv)^[3]

或者直接

TBlock(block)[3] = TBlock(iv)[3]

......对不起,我已经和Delphi合作了10年