Как я могу изменить конкретную часть двоичного скаляра в Perl? - PullRequest
2 голосов
/ 12 марта 2009

Я использую механизмы 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 ...» Мне просто интересно, почему два двоичных скаляра нельзя объединить в двоичный скаляр?

Вы можете мне помочь? Спасибо!

Ответы [ 3 ]

4 голосов
/ 12 марта 2009
my $msglen=substr($buffer,0,2); # Get the first two bytes
my $number = unpack("S",$msglen);
$number += 3;
my $number_bin = pack("S",$number);
substr($buffer,0,2,$number_bin); # change the length

Не проверено, но я думаю, что это то, что вы пытаетесь сделать ... преобразовать строку с двумя байтами, представляющими короткое int, в реальный объект int, а затем обратно.

1 голос
/ 12 марта 2009

Я нашел другой способ - использование vec

vec($buffer, 0, 16) += 3;
0 голосов
/ 12 марта 2009

Вы не можете соединить два двоичных буфера в Perl напрямую, все, что вам нужно сделать, это вызвать pack , чтобы получить ASCII, а затем присоединиться к нему и вызвать распаковать , чтобы получить обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...