arrays - Delphi 中以空终止整数的 BYTE 数组 (BYTE[]) 相当于什么?

标签 arrays sockets delphi delphi-10-seattle

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

Incompatible types: 'AnsiChar' and 'Integer'

AnsiChar 数组的最后一个元素,这是一个以 null 终止的整数。怎么解决?

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

最佳答案

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

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.)

以上各项含义相同。

关于arrays - Delphi 中以空终止整数的 BYTE 数组 (BYTE[]) 相当于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55690653/

相关文章:

Delphi:将对象传输到远程计算机

delphi - 如何禁用ActionMainMenuBar中的菜单、子菜单?

delphi - 如何使用 Delphi 2009 和 Unicode 字符串正确调用 GetLongPathName?

java - 如何将字符串数据从sqlite for android存储到整数数组中

python - numpy.copy 数组的内存问题

javascript - 从数组中获取数据

计算数组偏移量的 Pythonic 方法

Java Server-接受更多客户端

c++ - async_send 数据未发送

c++ - 在我的代码中出现这个 "10038 wsa socket"错误