Delphi中等效的BYTE数组(BYTE [])与null终止一个整数?

问题描述 投票:4回答:2

我遇到了麻烦,编译器说:

不兼容的类型:'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;

我在德尔福的尝试:

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);
arrays sockets delphi delphi-10-seattle
2个回答
8
投票

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

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

以上各项具有相同的含义。


4
投票

您可以使用#0将数字0表示为AnsiChar。但是,C ++代码将char值分配给BYTE数组,并且您不能隐式地将AnsiChar分配给Delphi中的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;
© www.soinside.com 2019 - 2024. All rights reserved.