我将一些C代码转换成Delphi
我需要将一些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, };
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++=0xff代码>C代码。那么函数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++=0xff代码>C代码。谢谢你,雷米,我真的很感激。谢谢你,雷米,我真的很感激。如果你不太懂C,那么最好不要做出判断。如果不是用于表示字节的类型,什么是无符号字符?回答问题总比抱怨你不理解的东西好。@DavidHeffernan unsi