在Delphi中以空终止为整数的BYTE数组(BYTE [])等效于什么?

Bro*_*wJr 4 sockets arrays delphi delphi-10-seattle

我陷入了编译器说的麻烦:

不兼容的类型:“ 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;
Run Code Online (Sandbox Code Playgroud)

我在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);
Run Code Online (Sandbox Code Playgroud)

Rud*_*uis 8

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

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

但是随后您会遇到一个错误,抱怨元素的数量,因此您必须添加约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); 
Run Code Online (Sandbox Code Playgroud)

但是,这可以简单得多:

var
  MyArray: array[0..MAX_PATH] of AnsiChar = 'ABCDEFGHI';
Run Code Online (Sandbox Code Playgroud)

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

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

send(S, MyArray, StrLen(MyArray) + 1, 0);
Run Code Online (Sandbox Code Playgroud)

或者,您可以执行以下操作:

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

FWIW #0顺序值为0的字符。替代方法是:

Chr(0)
#0
^@ (meaning Control+@; ^A = #1 = Chr(1), ^M = #13, etc.)
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么要全部使用“ MAX_PATH”?在原始的C ++代码中,数组长度最大只能为10个字符,而不是Delphi代码强制的261个字符。将数组固定为AnsiChar的MyArray:array [0 .. 9],然后可以在Delphi代码中使用Sizeof()而不是使用Length()或StrLen()+ 1。 (3认同)