我将一些C代码转换成Delphi

我将一些C代码转换成Delphi,c,delphi,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, }; 与 以下是我需要帮助的一段代码: u_char chm_ac_codelens[] = { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77, };

我需要将一些C代码转换为Delphi,我在这方面遇到了困难,请帮助。我可以替换:

u_char chm_ac_codelens[] = {
            0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77,
    };

以下是我需要帮助的一段代码:

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);
}

谢谢

不,我想你不能。您定义的是集合而不是数组。以下内容适用于您:

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年没有在德尔福工作了,但这是我能达到的预期行为。数组的大小(以字节为单位)为64,这是C代码所期望的


你可以在这里看到我的尝试:

不,我想你不能。您定义的是集合而不是数组。以下内容适用于您:

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年没有在德尔福工作了,但这是我能达到的预期行为。数组的大小(以字节为单位)为64,这是C代码所期望的


你可以在这里看到我的尝试:

你在MakeQuantHeader上遇到了麻烦,因为它是C鼓励的那种讨厌的东西

它使用指针算法(C语言吸引“特性”的缺陷之一)并将字符与字节混合在一起

第一个修复方法是用字节数组替换u_char*

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


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

您在使用MakeQuantHeader时遇到了问题,因为它是C所鼓励的那种讨厌的东西

它使用指针算法(C语言吸引“特性”的缺陷之一)并将字符与字节混合在一起

第一个修复方法是用字节数组替换u_char*

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


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

直译如下:

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;

直译如下:

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;


这取决于
chm\u ac\u codelens
的用法。它是否作为
*p
*qt
MakeQuantHeader
中使用?@zmechanic这不是全部代码,有更多的数组(更长的数组)和更多的函数,但如果我知道如何更改此数组,其余的将更容易。chm_ac_codelens用作*qt,但在其他功能中与MakeQuantHeader类似。整个代码就在本文的末尾,您可以找到答案,至少是关于如何在文档中声明常量数组的答案。这取决于
chm\u ac\u codelens
的用法。它是否作为
*p
*qt
MakeQuantHeader
中使用?@zmechanic这不是全部代码,有更多的数组(更长的数组)和更多的函数,但如果我知道如何更改此数组,其余的将更容易。chm_ac_codelens用作*qt,但在其他功能中与MakeQuantHeader类似。在本文的最后,您可以找到答案,至少是关于如何在文档中声明常量数组的答案?我猜它应该看起来像
函数MakeQuantHeader(var p:TIdBytes;qt:TIdBytes;tableNo:integer):TIdBytes
*p++=0xff
应该类似于
p^=$ff;公司(p),如果不看完整的代码,不了解您的Delphi技能和对C的理解,很难说
只是一种设置数组元素值并将指针移动到下一个元素的方法。如果不知道指针
*p
在调用
MakeQuantHeader
时的位置,则建议任何内容都是错误的。如果我们假设
*p
位于数组的开头,您可以安全地设置
p[0]=$ff
然后
p[1]=$db
,不复制内存,只需手动设置值或编写for循环即可。但您需要确保数组中的元素类型为4字节整数。
*p
在调用
MakeQuantHeader
时不在开头。这是孔代码(在末尾,附录B):。我已经在Delphi中实现了RTSP和RTP,但是我对C代码有问题,我已经很久没有使用它了…然后你使用
p^=$ff;公司(p),在我看来没问题。它看起来相当于
*p++=0xffC代码。那么函数MakeQuantHeader呢?我猜它应该看起来像
函数MakeQuantHeader(var p:TIdBytes;qt:TIdBytes;tableNo:integer):TIdBytes
*p++=0xff
应该类似于
p^=$ff;公司(p),如果不看完整的代码,不了解您的Delphi技能和对C的理解,很难说
只是一种设置数组元素值并将指针移动到下一个元素的方法。如果不知道指针
*p
在调用
MakeQuantHeader
时的位置,则建议任何内容都是错误的。如果我们假设
*p
位于数组的开头,您可以安全地设置
p[0]=$ff
然后
p[1]=$db
,不复制内存,只需手动设置值或编写for循环即可。但您需要确保数组中的元素类型为4字节整数。
*p
在调用
MakeQuantHeader
时不在开头。这是孔代码(在末尾,附录B):。我已经在Delphi中实现了RTSP和RTP,但是我对C代码有问题,我已经很久没有使用它了…然后你使用
p^=$ff;公司(p),在我看来没问题。它看起来相当于
*p++=0xffC代码。谢谢你,雷米,我真的很感激。谢谢你,雷米,我真的很感激。如果你不太懂C,那么最好不要做出判断。如果不是用于表示字节的类型,什么是无符号字符?回答问题总比抱怨你不理解的东西好。@DavidHeffernan unsi