我正在尝试将代码从.c转换为Delphi。在这个.c应用程序中,所有套接字通信都是通过十六进制值进行的。第一次沟通是:
C代码:unsigned char bufSend1 [] = {0x00,0x00,0x00,0x00};
我在Delphi中做过:
SockStream.WriteBuffer(#0#0#0#0,4);
但是现在,在C中我有类似的东西:
unsigned char bufSend2 [] = {0x6f,0x06,0xff};
如何通过socketstream发送此值? #0#0#0#0正确的做法是什么?
答案 0 :(得分:2)
使用十六进制表示法将其编码为Delphi字符。
在Delphi中,十六进制由$
前缀表示,#
表示Char
。因此,您bufSend2
值的等效值为:
SocketStream.WriteBuffer(#$6f#$06#$ff, 3);
#
表示下一个值为Char
,$6f
表示十六进制值(相当于C中的0x6f
)。您只需将它们一个接一个地放置,就像使用#0#0#0#0
值一样。
更好的解决方案是将每个值正确地转换为适当的AnsiChar
值,如果您发送少量字符,该值可以正常工作:
SocketStream.WriteBuffer(AnsiChar(#$6f) + AnsiChar(#$06) + AnsiChar(#$ff), 3);
然而,最好的解决方案是使用array of Byte
:
// Static array
var
Buff: array[0..100] of Byte;
Buff[0] := $6f;
Buff[1] := $06;
Buff[2] := $ff;
SocketStream.WriteBuffer(Buff[0], 3);
// Dynamic array
var
Buff: array of Byte;
SetLength(Buff, 3);
Buff[0] := $6f;
Buff[1] := $06;
Buff[2] := $ff;
SocketStream.WriteBuffer(Buff[0], Length(Buff));
要向任一阵列添加文字,只需使用Ord(AnsiChar(Letter))
,例如
var
s: AnsiString;
i: Integer;
Len: Integer;
s := 'Test';
Len := Length(s);
SetLength(Buff, Len);
for i := 1 to Len do
Buff[i - 1] := Ord(AnsiChar(s[i]));
SocketStream.WriteBuffer(Buff[0], Len);
答案 1 :(得分:1)
我假设您正在呼叫TWinSocketStream.Write
。这被声明为:
function Write(const Buffer; Count: Longint): Longint;
无类型const
参数可以接收任何内容。您想传递一个字节数组。有几种方法可以做到这一点。例如:
const
bufSend2: array [0..2] of Byte = ($6f, $06, $ff);
....
SockStream.WriteBuffer(bufSend2, SizeOf(bufSend2));
或者
SockStream.WriteBuffer(Pointer(TBytes.Create($6f, $06, $ff))^, 3);
我个人认为我更喜欢前者。它有点冗长。但是您不必对字节数进行硬编码,而是避免堆分配。