передача int по сети - PullRequest
1 голос
/ 04 июня 2011

Я новичок в сетевом программировании, поэтому у меня есть вопрос: безопасно ли отправлять целое число (допустим, 16-битное целое число, потому что 32 имеет проблему с "endianess") в моем случае между C ++ и C # и как это сделать?

В моей программе я приводил int к типу char (знаю, что он меньше 255) и отправлял его. Тем не менее, я хотел бы отправить 32 Int. Я попытался провести это с буферами протокола. Я использовал WriteVarint32 в C ++ и ProtoReader.ReadUInt32 в C # безуспешно (исключение в C #). Я думал, что это будет работать после того, как я прочитал это .

Будете ли вы так любезны и предложите мне правильный способ отправки целого числа между приложениями C ++ и C #? Если бы вы объяснили мне, как это сделать с помощью буферов протокола (protobuf-net в случае C #), я был бы очень рад.

Ответы [ 3 ]

1 голос
/ 04 июня 2011

В кодировке varint нет проблем с порядком байтов, в дизайне он всегда имеет порядок байтов.Он хранит значение семь битов одновременно, начиная с наименее значимых семи бит, и использует восьмой бит в качестве стоп-бита, когда не осталось больше одного бита.

Вы используете метод Read7BitEncodedInt в C # дляпрочитайте целое число в кодировке.

1 голос
/ 04 июня 2011

В основном это будет зависеть от сетевых библиотек, которые вы используете, и от того, насколько они совместимы.На самом низком уровне данные передаются в виде потока или блока байтов.Когда эти байты преобразуются обратно в любую более сложную структуру выше байта (даже целого), тогда кодировка, очевидно, имеет значение и должна совпадать на обоих концах.

Самое простое - просто попробовать и посмотреть.

Звучит так, что вас может заинтересовать как можно более плотная упаковка данных (из вашего комментария о преобразовании целых чисел в символы), и в этом случае, возможно, вам следует просто написать набор процедур низкоуровневой упаковки с обоих концов.Таким образом, вы не будете беспокоиться о кодировании и сможете выжать каждый последний бит из пакета.

0 голосов
/ 04 июня 2011

Если вы пишете с protobuf-net, методы WithLengthPrefix сделают это за вас. Я был бы более чем рад помочь с этим (я автор). Между прочим, причина, по которой он генерирует исключение, заключается в том, что значение varint само по себе обычно недопустимо в потоке protobuf. Система переопределит это в случае WithLengthPrefix, если вы передадите 0 в качестве номера поля (или передадите положительное число поля для более чистого потока protobuf; хотя это необязательно).

Поскольку в ProtoReader есть метод для чтения изолированного варианта (не беспокоясь о семантике потока protobuf), было бы тривиально добавить его в ProtoWriter, если это было бы полезно.

Кстати - в терминах PrefixStyle, Base128 - это то же самое, что и varint. Некоторые люди предпочитают 32-битные префиксы, чтобы вступать в брак с другими системами - следовательно, некоторые другие предоставляются.

...