2009-03-12 6 views
2

select(), sysread(), syswrite() 메커니즘을 사용하여 메시지를 sysread()가 syswritten되기 전에 $ buffer (바이너리)로 처리하는 소켓 메시지를 처리합니다.Perl에서 바이너리 스칼라의 특정 부분을 어떻게 수정할 수 있습니까?

이제 전체 메시지의 길이를 나타내는 2 바이트의 메시지를 변경하고 싶습니다. 처음에는 다음 코드를 사용합니다.

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 ..."입니다. 왜 2 개의 2 진 스칼라가 2 진 스칼라에 결합 될 수 없는지 궁금합니다.

도와 주시겠습니까? 고맙습니다!

답변

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에서 직접 2 개의 바이너리 버퍼를 결합 할 수 없다면 pack을 호출하여 ASCII를 얻은 다음 다시 입력하고 unpack을 호출하면됩니다.

+0

가 바이너리 문자열을 결합 아무 문제가 없다, 그러나 당신이 올바른 데이터에 가입해야한다. –

1

나는 또 다른 가능한 방법을 발견했다 - 사용을 VEC

vec($buffer, 0, 16) += 3; 
관련 문제