Эффективные способы фильтрации нежелательных данных из буфера в C ++ - PullRequest
0 голосов
/ 24 мая 2018

Предположим, данные хранятся в символьном буфере в формате ниже

===========================================================================
|length| message1| length| message2| length| message3|...|length |messagen|
===========================================================================

Длина - указывает размер следующего сообщения

Из этого символьного буфера, предположим, что только message2 является нежелательным, а остальныевсе релевантны, насколько эффективно, message2 может быть удалено, так что остальные данные в буфере могут быть использованы успешно?

Я наткнулся на алгоритм на месте, где мы можем перемещать сообщения в самом буфере безлюбая дополнительная копия

Но при этом также возникают накладные расходы по смещению (n-2) сообщений, поскольку message2 не имеет значения

Есть ли какой-нибудь лучший подход / решение для этого в c ++?

Позвольте мне добавить более подробную информацию. Требование заключается в том, чтобы удалить / отфильтровать нерелевантные данные из буфера и затем передать их в качестве входных данных другой функции для дальнейшей обработки.

нерелевантные данные могут поступать в любую позицию.в символьном буфере.Просто например, упоминается как сообщение 2

1 Ответ

0 голосов
/ 24 мая 2018

Вы не говорите, сколько битов находится в вашем поле длины, но при условии, что вы можете сэкономить дополнительный бит, чтобы значения длины были подписаны, а не подписаны, я бы соблазнился принять соглашение, которое говорит: «еслиДлина заголовка имеет отрицательное значение, которое указывает на то, что его тело сообщения недопустимо и должно игнорироваться ".

После того, как вы приняли это соглашение, отметка сообщения 2 как недействительного является просто вопросом перезаписи.его длина-заголовок с отрицанием его текущего значения.

Конечно, код, который читает буфер позже, должен также следовать соглашению, так что если, например, если он видит длина-заголовок со значением-57 тогда он должен просто пропустить вперед на 57 байтов, не обрабатывая их.

...