Определение сообщений, используемых в протоколе, путем определения значения каждого байта, ну, в общем, старомодно. Сказав это, очень много текущих протоколов определены таким образом.
Если вы можете, лучше начать со схемы для протокола (например, файл .proto
для буферов протокола Google или файл .asn
для ASN.1, et c. многие из них на выбор), определяя сообщения, которые вы хотите обменять, а затем используйте выбранные вами средства технологий сериализации (например, protoc
для GPB, asn1c
для ASN.1, et c) для генерации кода.
Эта схема будет определять содержимое байтов "полезной нагрузки" в вашем примере, и вы оставите это на усмотрение GPB или чего-либо еще, чтобы решить, как передать тип сообщения, размер и длину для вас. Различные технологии сериализации имеют разные возможности в этом отношении. В GPB вы бы использовали структуру oneof
, чтобы объединить все различные типы контента, который вы хотите отправить, в одну структуру, но GPB не разграничивает различные сообщения в сети (вы должны добавить это самостоятельно, возможно, с помощью отправка сообщений с использованием ZeroMQ). Несколько форматов проводов ASN.1 делают разграничение между различными сообщениями, избавляя вас от беспокойства (полезно при необработанном соединении потока) XML также разграничен. Я не думаю, что Cap'n Proto делает разграничение.
Если вы застряли с протоколом, как определено побайтово, именно так, как вы показали, будет трудно найти сериализацию технология, которая с пользой совпадает. Скорее всего, вы будете обречены на написание всего кода самостоятельно.