Я использую механизмы select (), sysread (), syswrite () для обработки сообщений сокетов, где сообщения передаются sysread () в буфер $ (двоичный) до того, как они написаны syswritten.
Теперь я хочу изменить два байта сообщения, которые обозначают длину всего сообщения. Сначала я использую следующий код:
my $msglen=substr($buffer,0,2); # Get the first two bytes
my $declen=hex($msglen);
$declen += 3;
substr($buffer,0,2,$declen); # change the length
Однако, это не работает таким образом. Если конечное значение $ declen равно 85, то измененный буфер $ будет «0x35 0x35 0x00 0x02 ...». Я вставляю цифровой номер в буфер $, но, наконец, получил ASCII!
Я тоже пробовал так:
my $msglen=substr($buffer,0,2); # Get the first two bytes,binary
$msglen += 0b11; # Or $msglen += 3;
my $msgbody=substr($buffer,2); # Get the rest part of message, binary
$buffer=join("", $msglen, $msgbody);
К сожалению, этот метод также не удался. Результат такой как «0x33 0x 0x00 0x02 ...» Мне просто интересно, почему два двоичных скаляра нельзя объединить в двоичный скаляр?
Вы можете мне помочь? Спасибо!