2009-03-12 4 views
2

Я использую механизм select(), sysread(), syswrite() для обработки сообщений сокета, где сообщения sysread() в $ buffer (двоичные) перед их записью.Как я могу изменить определенную часть бинарного скаляра в Perl?

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

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

Помогите мне? Спасибо!

ответ

4
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, а затем обратно.

+0

Вы правы! Я страдаю этой проблемой в течение многих дней! Большое спасибо! – boyang

0

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

+0

Там нет никаких проблем присоединения двоичных строк, но вы должны присоединиться правильные данные. –

1

Я нашел еще один работоспособный способ - с помощью VEC

vec($buffer, 0, 16) += 3; 
Смежные вопросы