/ 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
Konvertere en binær streng til decimal ell~
Fra : Jesper Skriver


Dato : 30-11-00 21:49

Hej,

Jeg sidder og er ved at kigge på en statistik applikation,
som er baseret på MAC accounting in en Cisco router, for
at mappe disse MAC adresser til ip adresser,som jeg har
et mere "naturligt" forhold til , så griber jeg fat i
"arp MIB"'en, hvor jeg ved en SNMP walk får entries som

atPhysAddress.2.1.192.38.7.1 oTË°H OCTETSTR
atPhysAddress.2.1.192.38.7.2 €{ûh OCTETSTR
atPhysAddress.2.1.192.38.7.8 `/†}@ OCTETSTR
atPhysAddress.2.1.192.38.7.9 àOÑxÈ OCTETSTR
atPhysAddress.2.1.192.38.7.34 ࣔ OCTETSTR
atPhysAddress.2.1.192.38.7.37 avþÐ OCTETSTR
atPhysAddress.2.1.192.38.7.38 ÐÀ{€ OCTETSTR
atPhysAddress.2.1.192.38.7.39 bþÏ, OCTETSTR
atPhysAddress.2.1.192.38.7.45 o{` OCTETSTR

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 ?

--
Jesper Skriver, CCIE #5456

 
 
Adam Sjøgren (30-11-2000)
Kommentar
Fra : Adam Sjøgren


Dato : 30-11-00 22:32

On 30 Nov 2000 20:48:38 GMT, Jesper Skriver wrote:

> atPhysAddress.2.1.192.38.7.39 bþÏ, OCTETSTR
> atPhysAddress.2.1.192.38.7.45 o{` OCTETSTR

> 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 ?

Hvammæ' noget i den stil her, måske:

== =
#!/usr/bin/perl -w

while(<>)
{
chomp; print;

if( (undef, my $macstring) = /^atPhysAddress(\.\d+){6} (.+) OCTETSTR$/ )
{
if( length($macstring) == 3 )
{
$macstring=pack("c", 0) . $macstring;
print " padded";
}

if( my($macdec)=unpack("N", $macstring) )
{
printf " 0x%8.8x\n", $macdec;
}
else
{
print " Unrecognized binary gabbledigook: \"$macstring\"\n";
}
}
else
{
print " Unrecognized line: $_";
}
}
== =

?


Mvh.


PS: Har ændret "N2" til "N" i unpack-kaldet

--
"Er man et nul hvis man kommer før nummer et?" Adam Sjøgren
asjo@koldfront.dk

Adam Sjøgren (01-12-2000)
Kommentar
Fra : Adam Sjøgren


Dato : 01-12-00 00:41

On 30 Nov 2000 22:31:55 +0100, Adam Sjøgren wrote:

> Hvammæ' noget i den stil her, måske:

[...aaargh...]

Kan 4 dages influenza ikke bruges som undskyldning for den slags
synapskollaps?


,

--
"Obviously my body doesn't believe Adam Sjøgren
a word my brain is saying." asjo@koldfront.dk

Lars Balker Rasmusse~ (30-11-2000)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 30-11-00 23:55

jesper@wheel.dk (Jesper Skriver) writes:
> Jeg sidder og er ved at kigge på en statistik applikation,
> som er baseret på MAC accounting in en Cisco router, for
> at mappe disse MAC adresser til ip adresser,som jeg har
> et mere "naturligt" forhold til

Hmmm, et unaturligt forhold til MAC adresser. Jeg vil ikke vide mere.

, så griber jeg fat i
> "arp MIB"'en, hvor jeg ved en SNMP walk får entries som
>
> atPhysAddress.2.1.192.38.7.1 oTË°H OCTETSTR
> atPhysAddress.2.1.192.38.7.2 €{ûh OCTETSTR
> atPhysAddress.2.1.192.38.7.8 `/†}@ OCTETSTR
> atPhysAddress.2.1.192.38.7.9 àOÑxÈ OCTETSTR
> atPhysAddress.2.1.192.38.7.34 ࣔ OCTETSTR
> atPhysAddress.2.1.192.38.7.37 avþÐ OCTETSTR
> atPhysAddress.2.1.192.38.7.38 ÐÀ{€ OCTETSTR
> atPhysAddress.2.1.192.38.7.39 bþÏ, OCTETSTR
> atPhysAddress.2.1.192.38.7.45 o{` OCTETSTR
>
> 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.
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!

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
--
Lars Balker Rasmussen "Woo hoo!?"

Adam Sjøgren (01-12-2000)
Kommentar
Fra : Adam Sjøgren


Dato : 01-12-00 00:17

On 30 Nov 2000 23:54:50 +0100, Lars Balker Rasmussen wrote:

> 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!

Kommaet?!

Jeg tænkte på det binære gnyf som en 32-bit int først (uh, jeg har for
lidt med MAC-adresser at gøre til at huske at de er på 48 bit, og
net-faq.dk skriver intet om længden).

Man kan godt nok komme på afveje når man, som mig, ikke tænker sig
om... Hvad med denne i stedet:

== =
#!/usr/bin/perl -w

use strict;

my $string=pack "C6", 10,11,12,13,14,15;

my @mac=getmacstringsfrombinary($string);
print join ":", @mac;
print "\n";

sub getmacstringsfrombinary
{
my($macstring)=@_;
my $padding=6-length($macstring);

$macstring="\000" x $padding . $macstring; # Pad to 6 bytes
my(@macdec)=unpack("C6", $macstring) or warn("Wussup?!"); # Unpack

return map { sprintf "%2.2x", $_ } @macdec;
}
== =

== =
virgil$ ./macperl4
0a:0b:0c:0d:0e:0f
virgil$
== =



--
"Er man et nul hvis man kommer før nummer et?" Adam Sjøgren
asjo@koldfront.dk

Jesper Skriver (01-12-2000)
Kommentar
Fra : Jesper Skriver


Dato : 01-12-00 00:27

On 01 Dec 2000 00:16:56 +0100, Adam Sjøgren wrote:
>On 30 Nov 2000 23:54:50 +0100, Lars Balker Rasmussen wrote:
>
>> 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!
>
>Kommaet?!
>
>Jeg tænkte på det binære gnyf som en 32-bit int først (uh, jeg har for
>lidt med MAC-adresser at gøre til at huske at de er på 48 bit, og
>net-faq.dk skriver intet om længden).
>
>Man kan godt nok komme på afveje når man, som mig, ikke tænker sig
>om... Hvad med denne i stedet:
>
>== =
>#!/usr/bin/perl -w
>
>use strict;
>
>my $string=pack "C6", 10,11,12,13,14,15;
>
>my @mac=getmacstringsfrombinary($string);
>print join ":", @mac;
>print "\n";
>
>sub getmacstringsfrombinary
>{
> my($macstring)=@_;
> my $padding=6-length($macstring);
>
> $macstring="\000" x $padding . $macstring; # Pad to 6 bytes
> my(@macdec)=unpack("C6", $macstring) or warn("Wussup?!"); # Unpack
>
> return map { sprintf "%2.2x", $_ } @macdec;
>}

Tusind tak, det virker !!

$ ./mac-acct.pl
2.1.192.38.7.1 00:10:54:cb:b0:48

--
Jesper Skriver, CCIE #5456

Jesper Skriver (01-12-2000)
Kommentar
Fra : Jesper Skriver


Dato : 01-12-00 00:20

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

Adam Sjøgren (01-12-2000)
Kommentar
Fra : Adam Sjøgren


Dato : 01-12-00 00:30

On 30 Nov 2000 23:20:11 GMT, Jesper Skriver wrote:

> 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]) ) {

Hjælper det ikke med en liste i stedet for en scalar: my(@macdec)=...
?

Mvh.

--
"Er man et nul hvis man kommer før nummer et?" Adam Sjøgren
asjo@koldfront.dk

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

Månedens bedste
Årets bedste
Sidste års bedste