我将一些C代码转换为Delphi

时间:2017-03-05 01:04:25

标签: c delphi

我需要将一些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);
}

谢谢!

3 个答案:

答案 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 *。

您的第二个修复是将索引处理到数组中,而不是更改对象的“地址”以包含当前偏移量。

第三是验证确实有足够的空间,而不是冒着踩踏内存的风险。