Нет причин делать что-то такое сложное. Я вижу, что у вас есть идентификатор действия, поэтому я предполагаю, что будет фиксированное количество действий.
Для каждого действия вы определяете структуру данных, а затем помещаете каждое из этих значений в структуру. Чтобы отправить его по сети, вы просто выделяете сумму (sizeof (struct.i)) байтов для каждого элемента в вашей структуре. Итак, ваш пакет будет выглядеть так:
[action ID][item 1 (sizeof(item 1 bytes)][item 1 (sizeof(item 2 bytes)]...[item n (sizeof(item n bytes)]
Идея в том, что вы уже знаете размер и тип каждой переменной на каждой стороне соединения, поэтому вам не нужно отправлять эту информацию.
Для строк вы можете просто добавить их в завершенную нулем форму, а затем, когда вы «знаете» искать строку в зависимости от типа вашего пакета, начать читать и искать нулевой.
-
Другой вариант - использовать \ r \ n для разграничения ваших переменных. Это потребует некоторых накладных расходов, и вам придется использовать текст, а не двоичные значения для чисел. Но таким образом вы можете просто использовать readline для чтения каждой переменной. Ваши пакеты будут выглядеть так
[action ID]
[item 1 (as text)]
...
[item n (as text)]
-
Наконец, простой сериализация объектов и передача их по проводам - это тоже хороший способ сделать это с наименьшим количеством кода для записи. Помните, что вы не хотите преждевременно оптимизировать, в том числе и сетевой трафик. Если окажется, что позже вам нужно немного повысить производительность, вы можете вернуться и найти более эффективный механизм.
И проверьте буферы протокола Google , которые, предположительно, являются чрезвычайно быстрым способом сериализации данных нейтральным от платформы способом, вроде двоичного XML, но без вложенных элементов. Также есть JSON , который является еще одной платформно-нейтральной кодировкой. Использование буферов протокола или JSON означало бы, что вам не придется беспокоиться о том, как конкретно кодировать сообщения.