Delphi 中的 BYTE 数组 (BYTE[]) 的等价物是一个以 null 结尾的整数?
What the equivalent of BYTE array (BYTE[]) in Delphi with null termination a integer?
我陷入了这个麻烦,编译器说:
Incompatible types: 'AnsiChar' and '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);
您可以几乎按照您的方式定义它:
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(),而不是 长度():
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.)
以上含义相同
您可以使用 #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;
我陷入了这个麻烦,编译器说:
Incompatible types: 'AnsiChar' and '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);
您可以几乎按照您的方式定义它:
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(),而不是 长度():
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.)
以上含义相同
您可以使用 #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;