Цель memcpy
- сделать код непереносимым и внести неловкие ошибки при компиляции кода на другом компьютере.Для этого в maxsz
устанавливается какое-то значение в зависимости от того, что вы только что прочитали.Правильное значение зависит от машины.(Если я могу доверять именам, существует также неопределенное поведение: bytes_transferred
равно 4. И будет неопределенное поведение, если вы портируете на компьютер, где unsigned
long
равен 64 битам.)
В зависимостив протоколе вы должны использовать:
maxsz = static_cast<unsigned char>(tempbuff[1])
| (static_cast<unsigned char>(tempbuff[2]) << 8)
| (static_cast<unsigned char>(tempbuff[3]) << 16)
| (static_cast<unsigned char>(tempbuff[4]) << 24);
или
maxsz = (static_cast<unsigned char>(tempbuff[1]) << 24)
| (static_cast<unsigned char>(tempbuff[2]) << 16)
| (static_cast<unsigned char>(tempbuff[3]) << 8)
| static_cast<unsigned char>(tempbuff[4]);
(Измените тип tempbuff
на unsigned char[5]
, и вы можете исключить static_cast
.Однако это может потребовать других изменений в других местах.)
Кроме того, второй if
почти наверняка должен быть:
if ( bytes_transferred > 4 )
, а не >=
(или, альтернативно, >= 5
).Или имя не должно быть bytes_transferred
.Ваш код получает доступ ко всем пяти байтам tempbuff
.(Впрочем, я подозреваю, что если bytes_transferred
не совсем 5, все испортится.)