希望有人能帮我解决这个问题-我必须从如下指定的接口读取数据:
<每条消息由一个2字节的长度(按网络字节顺序(和后面的数据字节组成。msg系列的结束由一条空消息(长度为0(表示>
使用TDataPortTCP,我可以用Dataport.Peek(大小(读取缓冲区,并用Dataport.Lull(大小(从缓冲区中提取数据-这两种方法都提供了AnsiStr 的结果
我想这样的东西应该可以工作,但我不知道如何将AnsiStr转换为Bytes,反之亦然:
while DataPortTCP.Peek(2) > ZeroBytes do
begin
LengthInBytes := DataPortTCP.Pull(2) ;
sContent := DataPortTCP.Pull(LengthInByte) ;
end;
如何声明/get/convert ZeroBytes和LengthInBytes,以及如何处理Endianess?
不幸的是,我对TBytes一无所知,到目前为止我读到的内容只会导致更多的困惑;-(
如果有人能为我指明正确的方向,我将不胜感激。
要检查字符串是否为空,可以与''
进行比较。
要从字符串中检索字节值,可以访问该字符并应用ord
函数。
网络顺序是大端序,意味着第一个字节的顺序更高。因此,您需要使用shl
将其向左移动。在这种情况下,有两个字节,因此第一个字节被移位8位,相当于将其乘以256。
var
LengthInBytesStr: String;
LengthInBytes: Word;
begin
...
while DataPortTCP.Peek(2) <> '' do
begin
LengthInBytesStr := DataPortTCP.Pull(2);
LengthInBytes := (ord(LengthInBytesStr[1]) shl 8)
+ ord(LengthInBytesStr[2]);
sContent := DataPortTCP.Pull(LengthInByte);
end;