SocketStream发送Hex值

时间:2013-11-08 19:53:14

标签: delphi

我正在尝试将代码从.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正确的做法是什么?

2 个答案:

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

我个人认为我更喜欢前者。它有点冗长。但是您不必对字节数进行硬编码,而是避免堆分配。