【问题标题】:What the equivalent of BYTE array (BYTE[]) in Delphi with null termination a integer?Delphi中的BYTE数组(BYTE [])与空终止整数的等价物是什么?
【发布时间】:2019-04-15 13:49:05
【问题描述】:

我陷入了编译器所说的这个麻烦中:

不兼容的类型:'AnsiChar' 和 'Integer'

AnsiChar 数组的最后一个元素,这是一个整数,它是一个空终止符。如何解决?

C++ 代码:

static const BYTE  myarray[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 0 };
SOCKET s;

// Usage example:
if(Send(s, (char *) myarray, sizeof(myarray), 0) <= 0)
      return;

我在 Delphi 中的尝试:

var
  MyArray: array [0 .. MAX_PATH] of AnsiChar = ( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 0 );
  S: TSocket;

// Usage example:
send(S, MyArray, Length(MyArray), 0);

【问题讨论】:

  • @Rudy 这不是最好的骗子。我重新打开了它。请张贴你的答案。最好也解释序数字符文字。谢谢。

标签: arrays sockets delphi delphi-10-seattle


【解决方案1】:

您可以几乎按照您的方式定义它:

var
  MyArray: array[0..MAX_PATH] of AnsiChar = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', #0);

但是你得到一个抱怨元素数量的错误,所以你必须添加大约 250 个额外的零来完成它:

// Possible, but not necessary, see below 
var
  MyArray: array[0..MAX_PATH] of AnsiChar = 
    ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 
     'I',  #0,  #0,  #0,  #0, ....
                ...
                ...
                ...            #0,  #0,  #0); 

但是,这可以更简单地完成:

var
  MyArray: array[0..MAX_PATH] of AnsiChar = 'ABCDEFGHI';

这种特殊语法应该在大多数版本的 Delphi 中都可以使用,并且不会出现编译器错误。

对于 send() 期间的长度,您必须使用 StrLen(),而不是 Length()

send(S, MyArray, StrLen(MyArray) + 1, 0);

或者,您可以这样做:

var
  Stg: AnsiString;
begin
  Stg := 'ABCDEFGHI';
  // Second parameter is untyped const, so use ^
  send(S, PAnsiChar(Stg)^, Length(Stg) + 1, 0);

FWIW,#0序数值 0 的字符。替代方案是:

Chr(0)
#0
^@ (meaning Control+@; ^A = #1 = Chr(1), ^M = #13, etc.)

以上每一个都有相同的含义。

【讨论】:

  • Length 不是数组的长度吗?因此不等于 C++ 代码中的 sizeof。
  • @David: Length(MyArray)MAX_PATH+1。刚刚检查过。更新了我的答案。
  • @RudyVelthuis,E2036 Variable required 在这里:PAnsiChar(Stg) 关于您的答案的替代解决方案。如何修复?
  • 不知道send的第二个参数是var参数(可能是无类型的var参数吧?)。在这种情况下,您必须传递PAnsiChar(Stg)^(注意添加的^)。
  • 为什么要使用MAX_PATH?在原始 C++ 代码中,数组长度最多只有 10 个字符,而不是 Delphi 代码强制的 261 个字符。将数组固定为MyArray: array [0 .. 9] of AnsiChar,则可以在Delphi代码中使用Sizeof(),而不是使用Length()StrLen()+1
【解决方案2】:

您可以使用#0 将数字0 表示为AnsiChar。但是,C++ 代码将 char 值分配给 BYTE 数组,并且您不能在 Delphi 中将 AnsiChar 隐式分配给 Byte,您需要进行类型转换。

C++ 代码到 Delphi 的直译看起来更像这样:

const
  myarray[0..9] of Byte = (Ord('A'), Ord('B'), Ord('C'), Ord('D'), Ord('E'), Ord('F'), Ord('G'), Ord('H'), Ord('I'), 0);
  // alternatively:
  // myarray[0..9] of AnsiChar = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', #0);

var
  s: SOCKET;
begin
  ...
  // Usage example:
  if (send(s, myarray, SizeOf(myarray), 0) <= 0) then
    Exit;
  ...
end;

【讨论】:

  • 基于我上一个关于send() a PByte type的问题,这里我们也可以制作:send(s, myarray^, SizeOf(myarray), 0)? PS:myarray^ 还是简单的myarray?见this
  • @BrowJr 你不能用^在Delphi中解引用一个固定的数组,只有一个指针,在这个例子中不需要使用指针,实际上不需要完全取消对固定数组的引用
猜你喜欢
  • 2018-08-07
  • 2023-03-12
  • 2019-03-09
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多