[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