2016-04-04 13 views
0

Я хочу добавить размер вектора в буфер. Но я точно не знаю, какой тип размера. В конце концов, std :: size_t не может быть фиксированным. На мой взгляд, я намерен использовать uint64_t вместо этого. Затем буфер хотел бы это:О сериализации вектора <int32_t> в буфере TCP?

8 bytes length | 4 bytes element1 | 4 bytes element2 | ... | 

Теперь вопрос uint64_t не означает зЬй :: size_t. Любые лучшие идеи будут оценены.

+1

Я не понимаю, о чем вы просите. Если вы хотите использовать четыре байта или восемь байтов или что угодно, чтобы закодировать размер в какой-то определенной форме или формате, просто сделайте это. В чем проблема? Вы можете использовать 'size_t' для хранения размера - какая разница, какой тип вы используете до тех пор, пока он может удерживать размер? –

+0

Кроме того, чтобы быть портативным, убедитесь, что вы получаете предсказуемую достоверность, например. используйте htonl() для 32-битных объектов перед отправкой их в сокет. –

+0

@David Schwartz Вопрос в том, что я не знаю, каков размер вектора. Я не могу просто использовать переменную uint64_t для хранения этого размера, а затем записать эту переменную в буфер. – NiklausTseng

ответ

1

Вы можете использовать любой тип, который вы хотите, если он может удерживать значение, которое вы используете. Поскольку это уже size_t, просто держите его таким образом. Определите, сколько байтов вы хотите использовать для представления значения и какое значение вам нужно для каждого байта, чтобы писать и писать код для правильного кодирования/декодирования каждого байта.

+0

Я уже собирался сказать: «Это ужасная идея. Размер вашего size_t, вероятно, 64 бит. Размер_t на моем маленьком процессоре ARM составляет 32 бита. Думаю, вы все равно можете получить устройства с размером_разбитых 16 бит». Но я неправильно понял. Вы имели в виду «use size_t, но кодируете это как 8 октетов при сохранении в буфере TCP (и если size_t - 32 бита, 4 из октетов обязательно будут в нуле)». - Согласовано. –

1

Вы почти находитесь. Никакая текущая платформа не использует size_t больше, чем 64 бит (и потребуется несколько дней для переноса 64-битной стоимости int32 поверх экспериментального волокна 100TBit). Шаги:

  1. const uint64_t len = vec.length();
  2. Написать восемь байт в ваш TCP буфера в определенном порядке.
  3. Напишите четыре байта каждого int в буфер tcp в определенном порядке.
  4. Отправить.

Обратите внимание, что последние два шага должен быть в цикле более чем несколько тысяч элементов ..