|
| pack/unpack og 24 bit integers Fra : Peter Makholm |
Dato : 06-02-07 11:51 |
|
Jeg har følgende protokol-beskrivelse:
From client to server during initial handshake.
VERSION 4.0
Bytes Name
----- ----
2 client_flags
3 max_packet_size
n (Null-Terminated String) user
8 scramble_buff
1 (filler) always 0x00
som jeg gerne modtage og sende med pack/unpack. Jeg ved (dvs. gætter
på fra andre pakker) at værdier bliver sendt som little endian. Kan
jeg på nogen måde let håndtere max_packet_size?
pack("vVXZ*A8x",$packet) virker tilsyneladende som jeg ønsker, men
kalder jeg unpack med samme template, så kommer den mestbetydende byte
til at indeholde ascii-værdien for det første bogstav (men forekommer
også i strengen, så user er korrekt).
Jeg ville meget gerne kunne bruge samme template begge veje. Er der
nogen anden udvej end at postproceserer efter en unpack?
//Makholm
| |
Peter Mogensen (08-02-2007)
| Kommentar Fra : Peter Mogensen |
Dato : 08-02-07 15:07 |
|
Peter Makholm wrote:
> Jeg ville meget gerne kunne bruge samme template begge veje. Er der
> nogen anden udvej end at postproceserer efter en unpack?
Det tror jeg ikke... men er det så slemt?
#!/usr/bin/perl
use strict;
use integer;
use Data::Dumper;
my $flags = 170; #0xAA;
my $mps = 87381; #0x15555;
my $user= "hejsa";
my $buf = "asdfghjk";
my $template = "vvCZ*A8x";
my $packet = pack($template,$flags,$mps%0x10000,$mps/0x10000,$user,$buf);
my @res = unpack($template,$packet);
$mps = $res[1] | ($res[2]<<16);
print Dumper(@res);
print "MPS: $mps\n";
| |
Peter Makholm (08-02-2007)
| Kommentar Fra : Peter Makholm |
Dato : 08-02-07 15:19 |
|
Peter Mogensen <apm-at-mutex-dot-dk@nospam.no> writes:
> Peter Makholm wrote:
>> Jeg ville meget gerne kunne bruge samme template begge veje. Er der
>> nogen anden udvej end at postproceserer efter en unpack?
>
> Det tror jeg ikke... men er det så slemt?
Nej, men det passede ikke helt ind i mit framework. Heldigvis viser
det sig at jeg ikke lige har brug for at manipulere dette felt. Så pyt
med at der er noget garbage i den mest betydende byte.
Så det virker faktisk for mig med "vVXZ*A8x":
#!/usr/bin/perl
use Data::Dumper;
my $flags = 170; #0xAA;
my $mps = 87381; #0x15555;
my $user= "hejsa";
my $buf = "asdfghjk";
my $template = "vVXZ*A8x";
my $packet = pack($template,$flags,$mps$user,$buf);
my @res = unpack($template,$packet);
$mps = $res[1] & 0x00FFFFFF ;
print Dumper(@res);
print "MPS: $mps\n";
| |
|
|