NetworkStream.Read вернет количество прочитанных байтов. Вы можете использовать это для извлечения только фактических данных.
int receivedBytes = stream.Read(receivedBuffer, 0, receivedBuffer.Length);
string msg = Encoding.ASCII.GetString(receivedBuffer,0,receivedBytes);
Обычно хорошие взгляды, но для 100%-й мобильности, замените это 8 CHAR_BIT (или numeric_limits:: макс. ()), так как не гарантируется, что символы 8-разрядные.
Любой хороший компилятор будет достаточно умен для слияния всех математических констант во время компиляции.
Можно вынудить это быть подписанным при помощи библиотеки черт типа. который обычно смотрел бы что-то как (предположение, что Вашу numeric_traits библиотеку называют numeric_traits):
typename numeric_traits<T>::signed_type x;
Пример вручную прокрученного numeric_traits заголовка мог быть похожим на это: http://rafb.net/p/Re7kq478.html (существует много комнаты для дополнений, но Вы получаете идею).
или еще лучше, используйте повышение:
typename boost::make_signed<T>::type x;
Править: IIRC, подписанные сдвиги вправо не должны быть арифметикой. Это распространено, и конечно случай с каждым компилятором, который я использовал. Но я полагаю, что стандарт оставляет его компилятором, являются ли сдвиги вправо арифметикой или не на типе со знаком. В моей копии чернового стандарта записано следующее:
Значение E1>> E2 является позициями двоичного разряда E1 rightshifted E2. Если E1 имеет неподписанный тип или если E1 имеет тип со знаком и неотрицательное значение, значение результата является неотъемлемой частью частного E1, разделенного на количество 2, возвел E2 в степень. Если E1 имеет тип со знаком и отрицательную величину, получающееся значение является определенной реализацией.
Но как я сказал, это будет работать над каждым компилятором, который я видел :-p.
Можно хотеть посмотреть на Повышение. Библиотека TypeTraits. Для обнаружения, подписывается ли тип, можно использовать is_signed черту. Можно также изучить enable_if/disable_if для удаления перегрузок для определенных типов.