1

我正在尝试将代码从 .c 转换为 Delphi。在这个 .c 应用程序中,所有套接字通信都是通过十六进制值进行的。第一次沟通是:

C 代码:无符号字符 bufSend1[] = { 0x00, 0x00, 0x00, 0x00 };

在德尔福我做了:

SockStream.WriteBuffer(#0#0#0#0, 4);

但是现在,在 CI 中有如下内容:

无符号字符 bufSend2[] = { 0x6f, 0x06, 0xff };

如何通过 socketstream 发送这些值?而#0#0#0#0 这样做的正确方法是什么?

4

2 回答 2

2

只需使用十六进制表示法将其编码为 Delphi 字符。

在 Delphi 中,十六进制由$前缀表示,#表示Char. 所以相当于你的bufSend2价值观是:

SocketStream.WriteBuffer(#$6f#$06#$ff, 3);

#表示下一个值是 a Char,并$6f表示十六进制值(相当于0x6fC 中的值)。您只需将它们一个接一个地放置,就像您对#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-08T19:58:56.853 回答
1

我假设你在打电话TWinSocketStream.Write。声明如下:

function Write(const Buffer; Count: Longint): Longint;

untypedconst参数可以接收任何内容。你想传递一个字节数组。有几种方法可以做到这一点。例如:

const
  bufSend2: array [0..2] of Byte = ($6f, $06, $ff);
....
SockStream.WriteBuffer(bufSend2, SizeOf(bufSend2));  

或者

SockStream.WriteBuffer(Pointer(TBytes.Create($6f, $06, $ff))^, 3);  

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

于 2013-11-08T21:10:57.920 回答