2009-03-12 11 views
2

私はsysread()をsysread()がsyswrittenされる前に$ buffer(バイナリ)に置くソケットメッセージを処理するためにselect()、sysread()、syswritePerlでバイナリスカラーの特定の部分を変更する方法はありますか?

ここで、メッセージ全体の長さを表す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 ..."になります。私はデジタル番号を$ 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 ..."です。なぜ私は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型のオブジェクトにshort int型を表す2バイトの文字列を変換すると...これはあなたがやろうとしているものだと思います。

+0

あなたは正しいです! 私は何日間もこの問題に苦しんできました!どうもありがとうございました! – boyang

0

Perlで2つのバイナリバッファを直接結合することはできません。packを呼び出してASCIIを取得し、それに参加してunpackを呼び出して戻ってください。

+0

を使用。 –

1

私は別の実行可能な方法を発見した - そこバイナリ文字列に加わる全く問題はませんが、あなたは右のデータを結合する必要がVEC

vec($buffer, 0, 16) += 3; 
関連する問題