如何在Perl中修改二进制标量的特定部分?

时间:2009-03-12 05:34:22

标签: perl string binary

我采用select(),sysread(),syswrite()机制来处理套接字消息,其中消息是sysread()到$ buffer(二进制)之前进行系统化。

现在我想更改消息的两个字节,它表示整个消息的长度。首先,我使用以下代码:

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,则修改后的$ buffer将为“0x35 0x35 0x00 0x02 ...”。我将数字编号插入$ buffer但最后得到了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 个答案:

答案 0 :(得分: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

未经测试,但我认为这是你要做的...将一个字符串用两个字节表示一个short int转换为一个实际的int对象然后再返回。

答案 1 :(得分:1)

我找到了另一种可行的方法 - 使用vec

vec($buffer, 0, 16) += 3;

答案 2 :(得分:0)

您无法直接在Perl中加入两个二进制缓冲区,只需调用pack获取ASCII,然后加入它并在其上调用unpack即可返回。