• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Problem parsing file in 64 bit build.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Problem parsing file in 64 bit build.


  • Subject: Problem parsing file in 64 bit build.
  • From: Graham Cox <email@hidden>
  • Date: Mon, 07 May 2012 15:51:10 +1000

Hi,

I'm having an issue with parsing a file that contains structures that are defined with type 'double'. These are 64-bit doubles, in little endian format. In my code, I have typdefs of the various structures and sub-structures within the file that are defined using fixed size types - SInt32, UInt32, Float64 and so on.

I'm using the relevant swapping routines to read the file into my local format. Everything is fine when I compile in 32-bit, but fails to work in 64 bit. It's acting as if the fields in the structures are misaligned.

Could this be caused by the 64 bit compiler padding out my structures in a different way for 64-bit builds? If so is there a way to tell it not to for these types?


Here's some example code:

typedef struct
{
	SInt32			fileCode;			// 9994, big endian
	SInt32			unused[5];
	UInt32			fileLength;			// big endian, length expressed as # of 16-bit words, including header
	SInt32			version;				// little endian, = 1000
	UInt32			shapeType;			// all little endian from here on
	Float64			xMin;				// bbox
	Float64			yMin;
	Float64			xMax;
	Float64			yMax;
	Float64			zMin;
	Float64			zMax;
	Float64			mMin;
	Float64			mMax;
}
ESRIFileHeader, *ESRIFileHeaderPtr;


typedef struct
{
	SInt32			recordNumber;		// big endian
	UInt32			contentlength;		// big endian, length expressed as # of 16-bit words
	SInt32			shapeType;			// little endian
}
ESRIRecordHeader, *ESRIRecordHeaderPtr;


// this fragment of code is where I do the pointer arithmetic:

		p = (unsigned char*)[_data bytes];
		eof = p + [_data length];
		p += sizeof( ESRIFileHeader );

		while( !done && !mShouldAbort )
		{
			// parse the record header

			recP = (ESRIRecordHeaderPtr) p;
			recNum = (NSInteger)CFSwapInt32BigToHost(recP->recordNumber);
			recLength = (NSUInteger)CFSwapInt32BigToHost(recP->contentlength) * 2;
			shapeType = (NSInteger)CFSwapInt32LittleToHost(recP->shapeType);

			NSLog( @"record #%ld, length=%lu, type=%ld", recNum, recLength, shapeType );		// displays garbage values in 64-bit build



In the file, the header is followed by a series of records, each of which has the header structure shown, and a variable length data portion. I use pointer arithmetic to skip past the header, using the sizeof(ESRIFileHeader) to compute the size. Even from the very first record, the following header is misaligned, indicating that sizeof() gives a different result for 32 versus 64 bit builds. Indeed, I get 100 in 32-bits, and 104 in 64-bit builds for the header structure.

That's bad enough, but the values in the Float64 fields of the header appear garbage in the debugger in the 64-bit build, so even though I believe I'm swapping them correctly, the values returned in the 64-bit version are nonsense. I'm less clear about why that should be, but again it could be padding - if the padding is not at the end of the structure but somewhere before the float values.

Basically, I need to know if there's a way to get the 64-bit compiler to treat these structures the same way as it does in a 32-bit build.


--Graham



_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Problem parsing file in 64 bit build.
      • From: Quincey Morris <email@hidden>
  • Prev by Date: Re: OSAtomic built-in operations
  • Next by Date: Re: Problem parsing file in 64 bit build.
  • Previous by thread: Re: OSAtomic built-in operations
  • Next by thread: Re: Problem parsing file in 64 bit build.
  • Index(es):
    • Date
    • Thread