2009-03-12 3 views
2

Ich adoptieren select(), sysread(), syswrite() -Mechanismus, um Socket-Nachrichten zu behandeln, in denen Nachrichten sysread() in $ buffer (binär) sind, bevor sie syswritten sind.Wie kann ich bestimmte Teile eines binären Skalars in Perl ändern?

Jetzt möchte ich zwei Bytes der Nachricht ändern, die die Länge der gesamten Nachricht angeben. Zuerst verwende ich folgenden Code:

Allerdings funktioniert es nicht auf diese Weise. Wenn der Endwert von $ declen 85 ist, dann wird der modifizierte $ Puffer "0x35 0x35 0x00 0x02 ..." sein. Ich füge digitale Zahl zu $ ​​Puffer ein, aber erhielt schließlich ASCII!

Ich habe auch versucht, auf diese Weise:

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); 

diese Methode leider auch gescheitert. Das Ergebnis ist wie folgt: "0x33 0x 0x00 0x02 ..." Ich frage mich nur, warum zwei binäre Skalare nicht zu einem binären Skalar zusammengefügt werden können.

Können Sie mir helfen? Vielen Dank!

Antwort

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 

Ungeprüfte, aber ich denke, das ist das, was Sie versuchen, eine Zeichenfolge mit zwei Bytes repräsentieren einen kurzen int in ein tatsächliches int Objekt und dann wieder zurück zu tun ... konvertieren.

+0

Sie haben Recht! Ich habe seit vielen Tagen mit diesem Problem zu leiden! Vielen Dank! – boyang

0

Sie können nicht zwei binäre Puffer in Perl direkt verbinden alles, was Sie tun müssen, ist pack aufrufen, um ein ASCII zu erhalten und dann beitreten und rufen Sie auf es zurück zu bekommen.

+0

Es gibt kein Problem Binärketten Beitritt, aber Sie haben die richtigen Daten zu verbinden. –

1

Ich habe eine andere praktikable Weg gefunden - mit vec

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