我正在尝试将代码从.c翻译到Delphi。在这个.c应用程序中,所有的套接字通信都是通过十六进制值进行的。第一份来文是:
C代码:无符号字符bufSend1[] ={ 0x00,0x00,0x00,0x00 };
在德尔菲我做了:
SockStream.WriteBuffer(#0#0#0#0,4);
但现在,在C语言中,我有这样的东西:
无符号字符bufSend2[] ={ 0x6f,0x06,0xff };
如何通过套接字流发送这些值?#0#0#0#0有什么正确的方法来做到这一点呢?
发布于 2013-11-08 19:58:56
只需使用十六进制符号将其编码为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); 发布于 2013-11-08 21:10:57
我想你是在给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); 我个人认为我更喜欢前者。更详细一点。但是您不必硬编码字节计数,也可以避免堆分配。
https://stackoverflow.com/questions/19867461
复制相似问题