Rmck wrote:
> 
> Hi

Hello,

> I have the .h file of a program that spits out a data file
> which is Binary Output. The binary file is a series of fixed
> length records.  In C, each record has the format which is
> in the script.
> 
> I thought I could use unpack to read the data, and I am
> having no success. PLEASE let me know if I'm using unpack
> correctly:
> 
> #!/bin/perl
> use strict;
> use POSIX 'strftime';
> use warnings;
> 
> #
> #struct binary_log_entry {
> #        int     major_protocol;  /* eg. ETHERTYPE_IP */
> #        int     minor_protocol;  /* eg. IPPROTO_TCP */
> #        u_long  src_ipaddress;   /* Source IP Address */
> #        u_long  dst_ipaddress;   /* Destination IP Address */
> #        u_short src_port;        /* Source port (if UDP or TCP) */
> #        u_short dst_port;        /* Desintation port (if UDP or TCP) */
> #        time_t  quanta_start;    /* UNIX GMT time at start of quanta */
> #        time_t  quanta_end;      /* UNIX GMT time at end of quanta */
> #        u_long  bytes_xfered;    /* Number of bytes transfered during quanta */
> #};

Is this running on an Intel compatible CPU?  A Spark CPU?  An Alpha CPU?

u_long, u_short and time_t are typedef types, not native C types and the
size of int is determined by the CPU's native word size.  Try compiling
and running this C program to see what their actual sizes are:

/*   sizes.c   */
#include <stdio.h>
#include <stdlib.h>

int main ( void )
{
    printf( "    int: %d\n u_long: %d\nu_short: %d\n time_t: %d\n",
        sizeof( int ),
        sizeof( u_long ),
        sizeof( u_short ),
        sizeof( time_t )
        );
    return EXIT_SUCCESS;
}
/*   sizes.c   */


> # this is the template we're going to feed to unpack(  )
> my $template = "i i A16 A16 s s l l A16";
                      ^^^ ^^^         ^^^
There are no text strings in that C struct.  You probably want something
like this:

my $template = 'i i a4 a4 S S l l L';


> #$template = "C*";
> 
> # open the file
> open(FILE,"/tmp/testiplog/file.binout") or die "Unable to open FILE:$!\n";
> 
> # read it in one record at a time

Do the records end with a newline?  If not, you may need to change the
input record separator.

$/ = \32;

> while (<FILE>) {
>      # unpack it, using our template
>     my 
> ($eth,$itcp,$src,$dst,$sport,$dport,$qstart,$qend,$bytes)=unpack($template,$_);
> 
>         #print "$eth,$itcp,$src,$dst,$sport,$dport,$qstart,$qend,$bytes\n";
>         print "$src,$dst,$sport,$dport,$qstart,$qend,$bytes\n";

You are probably going to need Socket::inet_net() to convert $src and
$dst to dotted quad format.

        print join( ',',
            inet_ntoa( $src ), inet_ntoa( $dst ),
            $sport, $dport, $qstart, $qend, $bytes
            ), "\n";


> }
> 
> # close the file
> close(FILE);



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to