/** * @file SegdReader.h * @brief SegD格式文件读取类 * @author * @date 2011-11-15 */ #pragma once #include "SegDHeader.h" #include "SeisLineData.h" namespace NSegD { typedef struct stuSegDFileHeader { unsigned short ver; //版本号:1=版本1.0,2=版本2.0,3=版本3.0(目前不支持3.0版) int fileNumber; //文件号 unsigned short formatCode; //格式代码 //时序 //0x0015 20 bit binary multiplexed //0x0022 8 bit quaternary multiplexed //0x0024 16 bit quaternary multiplexed //0x0036 24 bit 2's compliment integer multiplexed //0x0038 32 bit 2's compliment integer multiplexed //0x0042 8 bit hexadecimal multiplexed //0x0044 16 bit hexadecimal multiplexed //0x0048 32 bit hexadecimal multiplexed //0x0058 32 bit IEEE multiplexed //道序 //0x8015 20 bit binary demultiplexed //0x8022 8 bit quaternary demultiplexed //0x8024 16 bit quaternary demultiplexed //0x8036 24 bit 2's compliment integer demultiplexed //0x8038 32 bit 2's compliment integer demultiplexed //0x8042 8 bit hexadecimal demultiplexed //0x8044 16 bit hexadecimal demultiplexed //0x8048 32 bit hexadecimal demultiplexed //0x8058 32 bit IEEE demultiplexed //无效 //0200 Illegal, do not use //0000 Illegal, do not use unsigned short scanInterval; //采样间隔 int recordLength; //记录长度 //通常一次记录过程中的记录道数和采集参数是不变化的,所以通常仅有1个扫描类型 unsigned short scanTypesNum; //扫描类型个数 unsigned short channelNumPerScanType; //一个扫描类型内包含的道组数 int totalChannelsNumber; /* total number of channels */ unsigned short sampleSkewNum; //采样时偏头段个数 unsigned short trailerNum; /* 13-14 General trailer number */ unsigned short generalHeaderNum; /* 12 Number blocks in general header 头段块的个数(高四位)通用头段块个数,至少2个*/ unsigned short extendedHeaderNum; //扩展头段个数 int externalHeaderNum; //外部头个数 //头块长度 //( generalHeaderNum + scanTypesNum*(channelNumPerScanType+sampleSkewNum) + extendedHeaderNum + externalHeaderNum + 1 ) * 32 unsigned short year; //Year (0-99) unsigned short day; //Day (1-366) unsigned short hour; /* 14 Hour of day(0-23) */ unsigned short minute; /* 15 Minute of hour(0-59) */ unsigned short second; /* 16 Second of minute(0-59) */ //仅对时序保存方式有效//////////////////////////////////////////////// //每块的扫描个数为sb + 2^sbx unsigned short sb; /* 25 Number of scans per block */ unsigned short sbx; /* 24 sb的指数,范围0-15 */ int scanBytes; //每个扫描字节数,仅时序 } SEGD_FILE_HEADER; typedef struct stuSegDTraceHeader { int fileNumber; //文件号 unsigned short scanType; //扫描类型 unsigned short channelSetNum; //道集数 unsigned short traceNumber; /* 05-06 trace number 道号 */ unsigned short extendHeaderNum; /* 10 trace header extensions 扩展道头的个数 */ unsigned short sampleSkew; /* 11 sample skew of the first sample of the trace. It is a part of the fractional part of the base scan interval. Res :1/256 scan interval */ int samplesNumber; /* 每道采样点个数*/ } SEGD_TRACE_HEADER; class AFX_EXT_CLASS CSegdReader { public: CSegdReader(void); ~CSegdReader(void); bool Read(LPCTSTR lpszFileName); //包括充填CSegdFileHeader对象 bool ReadFileHeader(CFileSegy& fr); //读取文件头信息 bool ReadOneRecordBlock(CFileSegy& fr); //读取一个记录块 bool ReadTapeLabel(CFileSegy& fr); //读取版本2的磁带头信息,并设置版本号 bool ReadTraceHeader(CFileSegy& fr); //读取道头 bool ReadDataTrace(CFileSegy& fr, CSeisTraceData& td); //读取道数据 SEGD_FILE_HEADER& GetFileHeader() { return m_fileHeader; } SEGD_TRACE_HEADER& GetTraceHeader() { return m_traceHeader; } bool IsGain() { return m_bGain; } protected: bool InitializeTraceHeader(SEGD_DEMUX_TRACE_HEADER& traceHeader); bool InitializeFileHeader(SEGD_GENERAL_HEADER_1& header1, SEGD_GENERAL_HEADER_2& header2); bool InitializeFileHeader(SEGD_GENERAL_HEADER_1& header1); CSeisLineData m_tracesData; //所有道数据 SEGD_FILE_HEADER m_fileHeader; SEGD_TRACE_HEADER m_traceHeader; bool m_bGain; /* flag for applying gain 是否使用增益*/ void ClearChannelHeader(void); SEGD_CHANNEL_SET_HEADER* GetChannelSetHeader(int i, int j); float* GetGain(int i, int j); int GetBytesLength(int nSampleNum, int code); private: //文件头 SEGD_TAPE_LABEL m_stuTapeLabel; //版本2 格式的磁带标签定义 SEGD_GENERAL_HEADER_1 m_stuGHeader1; //头段块1 SEGD_GENERAL_HEADER_2 m_stuGHeader2; //头段块2 SEGD_GEN_HEAD_SN358 m_stuGHeaderSN358; SEGD_GENERAL_HEADER_N m_stuGHeaderN; //扩展头段 SEGD_SAMPLE_SKEW m_stuSampleSkew; //采样时偏 SEGD_EXTENDED_HEADER m_stuExtendedHeader;//扩展头段 SEGD_EXTERNAL_HEADER m_stuExternalHeader;//外部头段 SEGD_CHANNEL_SET_HEADER* m_pChannelHeader; //扫描类型头段,array[scanTypesNum][channelNumPerScanType] float* m_pGain; //增益,array[scanTypesNum][channelNumPerScanType] for escaling exponent //道头 SEGD_DEMUX_TRACE_HEADER m_stuTraceHeader; //道头 SEGD_TRACE_HEADER_EXT m_stuTraceHeaderExt; //道头扩展 /* repair byte swap of MP gain */ int imp0; int imp1; int icvt2s; /* Sercel glitch flag */ protected: bool Read(CFileSegy& fr, SEGD_GENERAL_HEADER_1& header1); void F8015_to_float (char *from, float* to, int len, int cvt2s); void F8022_to_float (char *from, float* to, int len, int cvt2s); void F8024_to_float (char *from, float* to, int len, int cvt2s); void F8036_to_float (unsigned char *from, float* to, int len); void F8038_to_float (char *from, float* to, int len); void F8042_to_float (char *from, float* to, int len); void F8044_to_float (char *from, float* to, int len); void F8048_to_float (char *from, float* to, int len); void F8058_to_float (char *from, float* to, int len); int BCD(unsigned char * ptr , int begin , int n); short GET_S(char* from); char GET_C(char *f); unsigned int GET_UC(unsigned char *f) { return f[0]; } unsigned short GET_US(unsigned char *f); }; }//namespace