我需要将一些C代码转换为Delphi,我对此感到困惑,请帮忙。我可以替换:
u_char chm_ac_codelens[] = {
0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77,
};
带
const chm_ac_codelens =[0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, $77];
以下是我需要帮助的一段代码:
u_char chm_ac_codelens[] = {
0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77,
};
u_char *
MakeQuantHeader(u_char *p, u_char *qt, int tableNo)
{
*p++ = 0xff;
*p++ = 0xdb; /* DQT */
*p++ = 0; /* length msb */
*p++ = 67; /* length lsb */
*p++ = tableNo;
memcpy(p, qt, 64);
return (p + 64);
}
谢谢!
答案 0 :(得分:4)
字面翻译如下所示:
var
chm_ac_codelens: array[0..15] of Byte = ( 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, $77 );
function MakeQuantHeader(p: PByte; qt: PByte; tableNo: Integer): PByte;
begin
p^ := $ff; Inc(p);
p^ := $db; Inc(p); { DQT }
p^ := 0; Inc(p); { length msb }
p^ := 67; Inc(p); { length lsb }
p^ := tableNo; Inc(p);
Move(qt^, p^, 64);
Inc(p, 64);
Result := p;
end;
答案 1 :(得分:0)
program ideone;
Const
chm_ac_codelens : array[1..16] of Longint = (0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119);
begin
Writeln(SizeOf(chm_ac_codelens))
end.
我已经17年没有和Delphi合作过了,但这与我预期的行为一样接近。数组的大小(以字节为单位)为64,正如C代码所预期的那样。
您可以在此处查看我的尝试:http://ideone.com/p0KQrl
答案 2 :(得分:0)
你在MakeQuantHeader上遇到麻烦,因为这是C鼓励的那种憎恶。
它使用指针算法(C的一个吸引人的“功能”)并将字符与字节混合。
你的第一个修复是用一个字节数组替换u_char *。
您的第二个修复是将索引处理到数组中,而不是更改对象的“地址”以包含当前偏移量。
第三是验证确实有足够的空间,而不是冒着踩踏内存的风险。