目前我正在尝试将用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;
但显然无法编译,因为无法分配表达式的左侧。
任何有更多移植练习的人都可以给我一个如何解决这个问题的提示吗? 提前谢谢。
答案 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年