int main( int nArgc, char ** papszArgv ) { const char *pszFilename; FILE *fp; CEOSRecord *psRecord; int nPosition = 0; if( nArgc > 1 ) pszFilename = papszArgv[1]; else pszFilename = "imag_01.dat"; fp = VSIFOpenL( pszFilename, "rb" ); if( fp == NULL ) { fprintf( stderr, "Can't open %s at all.\n", pszFilename ); exit( 1 ); } while( !VSIFEofL(fp) && (psRecord = CEOSReadRecord( fp )) != NULL ) { printf( "%9d:%4d:%8x:%d\n", nPosition, psRecord->nRecordNum, psRecord->nRecordType, psRecord->nLength ); CEOSDestroyRecord( psRecord ); nPosition = (int) VSIFTellL( fp ); } VSIFCloseL( fp ); exit( 0 ); }
CEOSImage * CEOSOpen( const char * pszFilename, const char * pszAccess ) { VSILFILE *fp; CEOSRecord *psRecord; CEOSImage *psImage; int nSeqNum, i; GByte abyHeader[16]; /* -------------------------------------------------------------------- */ /* Try to open the imagery file. */ /* -------------------------------------------------------------------- */ fp = VSIFOpenL( pszFilename, pszAccess ); if( fp == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open CEOS file `%s' with access `%s'.\n", pszFilename, pszAccess ); return NULL; } /* -------------------------------------------------------------------- */ /* Create a CEOSImage structure, and initialize it. */ /* -------------------------------------------------------------------- */ psImage = (CEOSImage *) CPLCalloc(1,sizeof(CEOSImage)); psImage->fpImage = fp; psImage->nPixels = psImage->nLines = psImage->nBands = 0; /* -------------------------------------------------------------------- */ /* Preread info on the first record, to establish if it is */ /* little endian. */ /* -------------------------------------------------------------------- */ VSIFReadL( abyHeader, 16, 1, fp ); VSIFSeekL( fp, 0, SEEK_SET ); if( abyHeader[0] != 0 || abyHeader[1] != 0 ) psImage->bLittleEndian = TRUE; /* -------------------------------------------------------------------- */ /* Try to read the header record. */ /* -------------------------------------------------------------------- */ psRecord = CEOSReadRecord( psImage ); if( psRecord == NULL ) { CEOSClose( psImage ); return NULL; } if( psRecord->nRecordType != CRT_IMAGE_FDR ) { CPLError( CE_Failure, CPLE_AppDefined, "Got a %X type record, instead of the expected\n" "file descriptor record on file %s.\n", psRecord->nRecordType, pszFilename ); CEOSDestroyRecord( psRecord ); CEOSClose( psImage ); return NULL; } /* -------------------------------------------------------------------- */ /* The sequence number should be 2 indicating this is the */ /* imagery file. */ /* -------------------------------------------------------------------- */ nSeqNum = CEOSScanInt( psRecord->pachData + 44, 4 ); if( nSeqNum != 2 ) { CPLError( CE_Warning, CPLE_AppDefined, "Got a %d file sequence number, instead of the expected\n" "2 indicating imagery on file %s.\n" "Continuing to access anyways.\n", nSeqNum, pszFilename ); } /* -------------------------------------------------------------------- */ /* Extract various information. */ /* -------------------------------------------------------------------- */ psImage->nImageRecCount = CEOSScanInt( psRecord->pachData+180, 6 ); psImage->nImageRecLength = CEOSScanInt( psRecord->pachData+186, 6 ); psImage->nBitsPerPixel = CEOSScanInt( psRecord->pachData+216, 4 ); psImage->nBands = CEOSScanInt( psRecord->pachData+232, 4 ); psImage->nLines = CEOSScanInt( psRecord->pachData+236, 8 ); psImage->nPixels = CEOSScanInt( psRecord->pachData+248, 8 ); psImage->nPrefixBytes = CEOSScanInt( psRecord->pachData+276, 4 ); psImage->nSuffixBytes = CEOSScanInt( psRecord->pachData+288, 4 ); if( psImage->nImageRecLength <= 0 || psImage->nPrefixBytes < 0 || psImage->nBands > INT_MAX / psImage->nImageRecLength || (size_t)psImage->nBands > INT_MAX / sizeof(int)) { CEOSDestroyRecord( psRecord ); CEOSClose( psImage ); return NULL; } /* -------------------------------------------------------------------- */ /* Try to establish the layout of the imagery data. */ /* -------------------------------------------------------------------- */ psImage->nLineOffset = psImage->nBands * psImage->nImageRecLength; psImage->panDataStart = (int *) VSIMalloc(sizeof(int) * psImage->nBands); if( psImage->panDataStart == NULL ) { CEOSDestroyRecord( psRecord ); CEOSClose( psImage ); return NULL; } for( i = 0; i < psImage->nBands; i++ ) { psImage->panDataStart[i] = psRecord->nLength + i * psImage->nImageRecLength + 12 + psImage->nPrefixBytes; } CEOSDestroyRecord( psRecord ); return psImage; }