我采用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 ...”我只是想知道为什么两个二进制标量不能加入二进制标量?
你能帮帮我吗?谢谢!
答案 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)