希望有人能帮我解决这个问题 - 我必须从这样指定的接口读取数据:
<每条消息由 2 字节长度(按网络字节顺序)组成,后跟那么多字节的数据。 msg 系列的结束由一个空消息(长度为 0)指示。>
使用 TDataPortTCP 我可以使用 Dataport.Peek(size) 读取缓冲区并使用 Dataport.Pull(size) 从缓冲区中提取数据 - 两种方法都提供 AnsiStr 形式的结果
我想这样的事情应该可行,但我不知道如何将 AnsiStr 转换为字节,反之亦然:
while DataPortTCP.Peek(2) > ZeroBytes do
begin
LengthInBytes := DataPortTCP.Pull(2) ;
sContent := DataPortTCP.Pull(LengthInByte) ;
end;
如何声明/获取/转换 ZeroBytes 和 LengthInBytes 以及如何处理 Endianess ?
不幸的是,我对 TBytes 一无所知,到目前为止我所阅读的内容只会导致更多的混乱;-)
如果有人能指出我正确的方向,我将不胜感激。
答案 0 :(得分:0)
要检查字符串是否为空,可以比较''
。
要从字符串中检索字节值,您可以访问该字符并应用 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;