Разбор двоичных данных в C - PullRequest
       2

Разбор двоичных данных в C

1 голос
/ 28 декабря 2011

У меня есть собственный двоичный протокол и двоичная спецификация для сообщения.Бинарный протокол добавляет несколько заголовков к каждому сообщению.Сообщение относительно большое и содержит около 50 различных полей.Мое требование состоит в том, чтобы анализировать только 2 поля из двоичного сообщения в c или c ++ с помощью компилятора gcc в linux 2.6.x.

Один разработчик создал класс, представляющий заголовки, и другой класс c ++, представляющий сообщение.Получив сообщение, он просто использует static_cast в байтной нагрузке, чтобы вернуть класс сообщения.Как только он получает класс объекта сообщения, он просто использует pointerToMessage.getFieldName () для получения данных.

Исправление к вышеприведенному абзацу.разработчик создал структуру, а не класс для сообщения.Структура использует gcc __attribute __ ((__pack__)).

Мой вопрос заключается в том, будет ли использование static_cast результата при анализе всего сообщения Или же анализ выполняется во время доступа, например, pointerToStruct.fieldName?Кроме того, он рассчитал время выполнения двух операций и обнаружил, что для выполнения static_cast не требуется практически никакого времени, где для доступа к полю через pointerToStruct.fieldName требуется около 120 микросекунд.Почему доступ к полю займет много времени?

1 Ответ

2 голосов
/ 28 декабря 2011

Мой вопрос заключается в том, что использование static_cast привело бы к анализу всего сообщения

Нет.Static_cast только сообщает компилятору, что содержимое памяти, на которое указывает приведенный указатель, должно обрабатываться так, как если бы оно содержало данные в том формате, в который вы преобразовали.Если данные не в этом формате, вы, скорее всего, получите мусор.

Если вы на 100% уверены, что входящий буфер содержит правильные данные и для типа, который приводится, это эффективный способдоступ к данным.Но так как вы говорите о сообщениях и протоколе, я должен был бы проверить, что такие вещи, как порядковый номер, выравнивание, заполнение и размер слова в системах связи, не будут мешать.и обнаружил, что для выполнения static_cast практически не требуется времени, где для доступа к полю с помощью pointerToMessage.getFieldName () требуется около 120 микросекунд.Почему доступ к полю занимает много времени?

Вероятно, потому что действительное приведение не делает очень много, по сути, оно просто создает указатель с данным типом на адрес памяти, который вы ему даете.Настоящий доступ происходит при попытке прочитать содержимое сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...