$Bill wrote:
  >Suresh Govindachar wrote:
  >> 
  >> The following code is meant for a Big-endian processor running
  >> linux.  The code reads binary files and assigns values to
  >> structures.  I would like to read the same data files in perl on
  >> Windows on little endian x86.  Any tips on doing the translation?
  >
  > I would just use unpack - you could write your own char-by-char
  > conversion routines if you wanted to (get_long, get_ulong,
  > get_short, etc).  Longs and shorts are considered to be 32/16
  > bits and ints are based on build type, but there are native
  > options.  Read the pack info in perlfunc man page.
  >
  > sysopen IN, $file, O_RDONLY or die "open $file: $! ($^E)"; 
  > binmode IN;

  I had to open the file via: 

    open (IN, "<:raw", $file_name) or die "Unable to open $file_name for 
reading:$!\n"; 
    binmode IN;

  Perl complained about bareword O_RDONLY -- see reproducible code
  below.

  > my $bytes = sysread IN, $data, 4;   
  > die "Wrong length data ($bytes): $! ($^E)" if $bytes != 4;
  > printf "data=%d\n", unpack 'N', $data;      # convert network order long
  > close IN;
  > 
  > # or read the whole struct into $data and unpack it in one call:
  > 
  > my ($type, $x, $y, $w, ... ) = unpack 'nNNN...', $data;

  Monk ikegami pointed out Convert::Binary::C.  This module worked
  after two tweaks:

  1) It did not recognize 'bool'.  Determined that size of bool was
     1 byte and so replaced bool by char.

  2) Total of sizes of members of one structure was 22.  C-code
     automatically padded 2 bytes.  I had to add a short into the
     structure at the right spot.

  But I was having trouble reading the file into scalars to be
  unpacked by Convert::Binary::C -- till I saw "sysread " in 
  this post!     


     #!/usr/bin/perl
     BEGIN {(*STDERR = *STDOUT) || die;}
     use diagnostics;
     use warnings;
     use strict;
     $| = 1;
     
     my $file = 'foofile';
     
       sysopen IN, $file, O_RDONLY or die "open $file: $! ($^E)"; # this is 
line 10
     
     __END__
     
     Uncaught exception from user code:
             Bareword "O_RDONLY" not allowed while "strict subs" in use at 
foo.pl line 10.
     Execution of foo.pl aborted due to compilation errors.

  Thanks,

  --Suresh


_______________________________________________
Perl-Win32-Users mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to