On 30 Nov 2000 23:54:50 +0100, Lars Balker Rasmussen wrote:
>jesper@wheel.dk (Jesper Skriver) writes:
>
>> Hvor selve mac adressen er noget binært "gnyf", jeg
>> har så prøvet at få det konverteret til enten decimalt
>> (da MAC accounting MIB'en repræsentere en MAC adresse
>> decimalt), eller hex. Jeg er ret sikker på at det er
>> unpack funktionen jeg skal have fat i, men jeg kan
>> ikke få det til at virke - er der nogen som har
>> erfaring med denne, og kan komme med et eksempel ?
>
>print er farlig for den kan fjerne information fra binær output.
Faktisk skal jeg ikke bruge det i en print, men som 6 (eller 1)
variable, så jeg kan matche det med output'et fra mac acct mib'en.
>Altså kan jeg ikke se om der faktisk er 6 oktetter i ovenstående
>output, og ved ikke hvad der gøres med under 6... Men jeg kan da se I
>begge er helt galt på den med at pakke oktetter ud med "N" og forvente
>at få en værdi med decimaler efter kommaet!
Der er 6 oktetter, en 'length($macstring)' siger 6
>Pil det binære ud fra input-strengen og kast unpack efter den:
>
> % perl -le 'print map { sprintf "%x:", $_ } unpack "C*", "oTË°H"'
> 6f:54:cb:b0:48:
>
>Hmmm, du fik 00:10 i stedet for 6f men jeg fik da b0:48 med. Jeg kan
>ikke se hvad der skull være galt, men antager at du har lavet en
>cut-n-paste fejl
Hmm, gad vide hvorfor nedenstående så ikke virker ... efter hvad jeg kan
se, så er det uhyre lig din kode ...
$ ./mac-acct.pl
2.1.192.38.7.1 length: 6 0x00000000
my $start_oid = ".1.3.6.1.2.1.3.1.1.2";
my $vb = new SNMP::Varbind([$start_oid]);
do {
my $val = $sess->getnext($vb);
if ( @{$vb}[0] eq "atPhysAddress" ) {
print @{$vb}[1]."\t";
print "length: ".length(@{$vb}[2])."\t";
if( my($macdec)=unpack("C*", @{$vb}[2]) ) {
printf " 0x%8.8x\n", $macdec;
} else {
print "Unrecognized binary gabbledigook: \"$macstring\"\n";
}
}
} until ($sess->{ErrorNum} || @{$vb}[0] !~ /^atPhysAddress/ );
--
Jesper Skriver, CCIE #5456