/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
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";


Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste