[Israel.pm] pack vs. different architectures

Levenglick Dov-RM07994 DovL at freescale.com
Tue Feb 1 04:55:42 PST 2005


Could this be an alignment issue? If so (and assuming gcc), you can circumvent this by specifying the alignment of the structure internals (http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Variable-Attributes.html#Variable-Attributes) and of the struct itself (http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Type-Attributes.html#Type-Attributes)

 
Best Regards,
Dov Levenglick
The information contained in this email is classified as:
[ ] General Business Information
[ ] Freescale Internal Use Only
[ ] Freescale Confidential Propriety
[x] Personal Memorandum
 


-----Original Message-----
From: perl-bounces at perl.org.il [mailto:perl-bounces at perl.org.il] On Behalf Of Roman M. Parparov
Sent: Tuesday, February 01, 2005 2:29 PM
To: Perl in Israel
Subject: [Israel.pm] pack vs. different architectures


Hey, guys.

I am facing the following problem:
I have to write a C structure into a binary file using a perl program.
That file is later read by an external utility.
The perl program runs on an Origin200 (IRIX64 nasa 6.4 02121744 IP27 mips)
compiled using 'cc -32' (because of Oracle 7.3.4 present) - perl 5.8.5
The external utility runs on a Pentium (Linux earth 2.4.22 i686)

Please note that the irix is a 64-bit machine.

The structure is as following:
struct rpthdr {
  char  id[8];    /* Station ID */
  float lat;      /* Latitude of Station */
  float lon;      /* Longitude of Station */ 
  float t;        /* Time in grid-relative units */ 
  int   nlev;	  /* Number of levels following */ 
  int   flag;     /* Level independent var set flag */ 
} hdr;

I am trying to write it using the following:
        open(DAT,">$dat");
        binmode(DAT,':raw');
	$hdr = {
		id=>'RSlifkin',
		lat=>30.5,
		lon=>31.5,
		t=>0,
		nlev=>1,
		flag=>1,
		},
		
	my $str =
	  pack('Z9',$hdr->{id}) .
	    pack('f',$hdr->{lat}) .
	      pack('f',$hdr->{lon}) .
		pack('f',$hdr->{t}) .
		  pack('I',$hdr->{nlev}) .
		    pack('I',$hdr->{flag});
	syswrite(DAT,$str);

After this I need to write a sequence of numbers:
	for my $d (@data) {
  	    syswrite(DAT,pack('f',$d));
	}
In fact I am writing a sequence of such structures.

But I am still having problems reading the file afterwards with that
external utility! For example, if I pack the id string with Z8, I lose
the last character, and if I pack it with a8 - two additional characters
are read for some reason. The lat/lon fields are read incorrectly and the
second structure is already a total garbage.

I guess given these architectures, the packing must be less trivial...
Any advices?

-- 
Roman M. Parparov - NASA EOSDIS project node at TAU technical manager.
Email: romm at empire.tau.ac.il		   http://www.nasa.proj.ac.il/
Phone/Fax: +972-(0)3-6405205 (work),        +972-(0)50-734-18-34 (home)
----------------------------------------------------------------------
The economy depends about as much on economists as the weather does on
weather forecasters.
                -- Jean-Paul Kauffmann
_______________________________________________
Perl mailing list
Perl at perl.org.il
http://perl.org.il/mailman/listinfo/perl



More information about the Perl mailing list