[fpc-pascal] Is there a Pos() function for TBytes?

Bo Berglund bo.berglund at gmail.com
Thu Apr 20 08:23:57 CEST 2023


I am transferring data via serial comm and they wind up inside a TBytes dyn
array.
Now I want to easily find a certain pattern of bytes inside that array, but how?

I have a cludge that does not feel right but works and I want to get it replaced
by the "correct" way of doing it.

So what I have done so far is the following kind of thing using an AnsiString to
supply the Pos() functionality:

var
  bData: TBytes;
  sData: AnsiString;
  p: integer;
begin
  GetSerialData(bData); //Load the array with incoming data
  SetLength(sData, Length(bData); //Prepare string to receive data
  Move(bData[0], sData[1], Length(bData)); //Copy all data
  p := Pos(pattern, sData);
  ...

I'd rather use some built-in function that is *not* using intermediate strings
but can operate on the TBytes array directly.

I found this page:
https://www.freepascal.org/docs-html/rtl/system/copy.html

Here there is also reference to the other functions for strings:
Delete  (string and dyn array)
Copy    (string and dyn array)
Insert  (string and dyn array but limited to 255 elements, why?)
Pos     (string only..)

They describe what can be done with strings and in some cases dynamic arrays
(like TBytes?), but for Pos() there is only string...

And Insert seems to have a limit of 255 elements, why?

What I need is a Pos(token) for TBytes where the token can be a single or
multiple bytes in size (just like for strings).

Is there such a thing?


-- 
Bo Berglund
Developer in Sweden



More information about the fpc-pascal mailing list