如何将 AnsiStr 转换为字节,反之亦然?

时间:2021-05-25 15:13:02

标签: string byte pascal lazarus

希望有人能帮我解决这个问题 - 我必须从这样指定的接口读取数据:

<每条消息由 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 一无所知,到目前为止我所阅读的内容只会导致更多的混乱;-)

如果有人能指出我正确的方向,我将不胜感激。

1 个答案:

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