///////////////////////////////////////////// // MyDlisLib.h #pragma once #define MAX_CURVE_NUM 256 struct Info_Reel // 轴信息 Type 132 133 { char ServiceName[6]; //6 65 Service Name char NoUse1[6]; //6 65 char Date[8]; //6 65 char NoUse2[2]; //6 65 char DataOrigin[4]; //6 65 char Nouse3[2]; //6 65 char ReelName[8]; //6 65 char NoUse4[2]; //6 65 char ReelContinueNo[2]; //2 65 char NoUse5[2]; //2 65 char PreReelName[8]; //8 65 char NoUse6[2]; //2 65 char Comments[74]; //74 65 }; struct Info_Tape // 磁带信息 Type 130 131 { char ServiceName[6]; //6 65 Service Name char NoUse1[6]; //6 65 char Date[8]; //6 65 char NoUse2[2]; //6 65 char DataOrigin[4]; //6 65 char Nouse3[2]; //6 65 char TapeName[8]; //6 65 char NoUse4[2]; //6 65 char TapeContinueNo[2]; //2 65 char NoUse5[2]; //6 65 char PreTapeName[8]; //8 65 char NoUse6[2]; //2 65 char Comments[74]; //74 65 }; struct Info_File //文件头尾信息 { char FileName[10]; // 10 65 文件名 char NoUse1[2]; // 2 65 空白 char ServiceID[6]; // 6 65 次级服务名 char VerID[8]; // 8 65 版本号 char ProductDate[8]; // 8 65 软件生成日期 char NoUse2; // 1 65 空白 char MaxPhiLen[5]; // 5 65 最大物理记录长度 char NoUse3[2]; // 2 65 空白 char FileType[2]; // 2 65 文件类型 char NoUse4[2]; // 4 65 空白 char FileNameB[10]; // 10 65 前邻文件名 }; struct Info_Block { BYTE Type ; // 1 66 元件类型码 BYTE DataCode; // 1 66 元件表示码 BYTE Length; // 1 66 元件长度 BYTE Kind; // 1 66 元件种类 char MNEM[4]; // 4 65 元件名称 char UNIT[4]; // 4 65 元件单位 }; struct DataItem { BYTE Type; // 1 66 项块类型 BYTE Length; // 1 66 项块长度 BYTE DataCode; // 1 66 表示码值 }; struct CurveS0 //40 BYTE 数据说明块 0 { char Name[4]; // 4 65 曲线名称 char ServeID[6]; // 6 65 服务ID char ServeSort[8]; // 8 65 服务序号 char Unit[4]; // 4 65 单位 struct APICodeS // API代码 { BYTE LogType; // 1 66 API测井类型 BYTE CurveType; // 1 66 API曲线类型 BYTE CurveGrade; // 1 66 API曲线级别 BYTE DefineData; // 1 66 API定义数 }APICode; BYTE FileNo[2]; // 2 79 文件号 BYTE Length[2]; // 2 79 长度 帧中存放的字节数 short noUse1; // 2 79 备用 BYTE ProcID; // 1 66 处理级 BYTE DotsNum; // 1 66 样点数 BYTE DataType; // 1 66 表示码 数据存放类型 BYTE Nouse2; // 1 66 备用 int Nouse3; // 4 73 备用 }; struct CurveS1 //40 BYTE 数据说明块 1 { char Name[4]; // 4 65 曲线名称 char ServeID[6]; // 6 65 服务ID char ServeSort[8]; // 8 65 服务序号 char Unit[4]; // 4 65 单位 struct APICodeS // API代码 { BYTE LogType; // 1 66 API测井类型 BYTE CurveType; // 1 66 API曲线类型 BYTE CurveGrade; // 1 66 API曲线级别 BYTE DefineData; // 1 66 API定义数 }APICode; BYTE FileNo[2]; // 2 79 BYTE Length[2]; // 2 79 BYTE noUse1[3]; // 3 66 备用 BYTE DotsNum; // 1 66 样点数 BYTE DataType; // 1 66 表示码 数据存放类型 BYTE ProcID[5]; // 5 77 处理级 }; struct Data_Explain_Block { BYTE End_Flag; // 1 66 项块结束标志 BYTE Data_Type; // 1 66 数据记录类型 BYTE Data_Mode; // 1 66 数据说明类型 int Frame_Length; // 1 73 数据帧长度 BYTE Log_Dir; // 1 66 上下测标志 BYTE Record_Unit; // 1 66 测井深度单位 float Refer_Point; // 4 68 数据参考点 char Refer_Unit[4]; // 4 65 数据参考点单位 float Frame_Step; // 2 79 帧之间的深度差 int Max_Frame_Count; // 1 66 最大记录帧数 float Invalid_Data; // 4 68 无效数据 BYTE Depth_Mode; // 1 66 深度记录方式 char Depth_Unit[4]; // 1 65 深度记录单位 BYTE Depth_Code; // 1 66 深度表示码 BYTE Curve_Mode; // 1 66 数据说明块的子类型 }; struct UseCurveS { char Name[40]; char Unit[40]; byte DotCount; float BytesNum; byte DataType; }; class MyLisLib { private: struct CurveS0 theCurveS0[MAX_CURVE_NUM]; struct CurveS1 theCurveS1[MAX_CURVE_NUM]; bool openFlag; int fileOptions; int Max_Phi_Len; BYTE tmpb[8200]; struct Data_Explain_Block m_explain_block; float curIndex; double realFrame_Step; int m_depth_mode; int b_ptr ; //填充块指针 BYTE tmp[40*1000*4]; int ii; int DataPtr[MAX_CURVE_NUM]; //曲线数据在一条记录里的指针位置 public: //attrib struct UseCurveS Curve[MAX_CURVE_NUM]; QFile *DataFile; int Year,Month,Day; int LogDir ; //-1 Up, 0 Time ,1 Down; float Frame_Step; int ProcessBlock; int CurveNum; int projRecordCount; MyLisLib() { Max_Phi_Len=1024; memset(tmpb,0,8200); Year=2000; Month=1; Day=1; openFlag=false; fileOptions=0; projRecordCount=1; LogDir=-1; Frame_Step=0.1f; m_depth_mode=1;//1;//深度记录方式:0-每帧数据都有一个深度,1-一个物理块只包含一个深度值 //=1时回转的数据再解编不正确,估计应该是转换模块的问题 ProcessBlock=0; CurveNum=0; for(int i=0;iclose(); openFlag = false; } ////////////////////////////////////////////////////////////////////////// ///注释掉:是因为当再次打开别的文件时会提醒文件已经关闭的异常提示 ////////////////////////////////////////////////////////////////////////// { DataFile=new QFile(dataFileName); fileOptions = nOpenFlags; if (fileOptions == 0) { DataFile->open(QIODevice::ReadOnly); } else if (fileOptions == 1) { DataFile->open(QIODevice::WriteOnly); } else if (fileOptions == 2) { DataFile->open(QIODevice::ReadWrite); } openFlag = true; } return 1; }; int CloseDataFile() { if (openFlag) { DataFile->close(); openFlag = false; } return 0; }; int FillLisFileHead() { unsigned short phiLen; struct Info_File *fileH; ///////////////////////////////////////// 文件头物理记录 tmpb[0]=0; tmpb[1]=62; // =4+2+sizoef(Info_File){56} tmpb[2]=0x80; tmpb[3]=0; ////////////////////////////////////////// // 填充文件头 tmpb[4]=128; tmpb[5]=0; fileH=(struct Info_File *)(&tmpb[6]); memset(fileH,0x20,sizeof(struct Info_File)); strcpy(fileH->FileName,"LISOUT.001"); strcpy(fileH->ServiceID,"MYYLIS"); strcpy(fileH->VerID,"2.00"); strcpy(fileH->ProductDate,"10/10/10"); strcpy(fileH->FileType,"LO"); char tmp[10]; memset(tmp,0,10); sprintf(tmp,"%d",Max_Phi_Len); strncpy(fileH->MaxPhiLen,tmp,5); ////////////////////////////////////////////// phiLen =tmpb[1]+tmpb[0]*0x100; DataFile->seek(0); DataFile->write((char*)&tmpb[0],phiLen); return phiLen; }; int FillLisFileTail() { unsigned short phiLen; struct Info_File * fileT; ///////////////////////////////////////// 文件头物理记录 tmpb[0]=0; tmpb[1]=62; // =4+2+sizoef(Info_File){56} tmpb[2]=0x80; tmpb[3]=0; ////////////////////////////////////////// // 填充文件头 tmpb[4]=129; tmpb[5]=0; fileT = (struct Info_File *)(&tmpb[6]); memset(fileT,0x20,sizeof(struct Info_File)); strcpy(fileT->FileName,"LISOUT.001"); strcpy(fileT->ServiceID,"MYYLIS"); strcpy(fileT->VerID,"2.00"); sprintf(fileT->ProductDate,"%2d/%2d/%2d",Month,Day,Year%100); strcpy(fileT->FileType,"LO"); char tmp[10]; memset(tmp,0,10); sprintf(tmp,"%d",Max_Phi_Len); strncpy(fileT->MaxPhiLen,tmp,5); ////////////////////////////////////////////// phiLen =tmpb[1]+tmpb[0]*0x100; DataFile->write((char*)&tmpb[0],phiLen); return phiLen; }; int FillLisDataItemT(BYTE Type, BYTE Length, BYTE DataCode, BYTE tmpt[],unsigned short phiLen) { int item_Len; struct DataItem item; item.Type = Type; item.Length = Length; item.DataCode= DataCode; memcpy(tmpb+phiLen,&item,sizeof(DataItem)); if( item.Length>0) { memcpy(tmpb+phiLen+sizeof(DataItem),tmpt,item.Length); } item_Len = sizeof(struct DataItem) +item.Length ; return item_Len; }; long FillLisDataBolck() { int i,tmpi; unsigned short phiLen; BYTE t1[100]; ProcessBlock=0; for(i=0;i255) t1[0]=255; if(t1[0]==0) t1[0]=1; phiLen += FillLisDataItemT(11,1,66,t1,phiLen); //无效数据 缺省为-9999.95 ConvertFloatToLisData(m_explain_block.Invalid_Data,t1,68); phiLen += FillLisDataItemT(12,4,68,t1,phiLen); if(m_explain_block.Depth_Mode==1) { //深度记录方式 t1[0]=m_explain_block.Depth_Mode; phiLen += FillLisDataItemT(13,1,66,t1,phiLen); //深度单位 if(LogDir !=0) memcpy(t1,"M ",4); else memcpy(t1,"S ",4); phiLen += FillLisDataItemT(14,4,65,t1,phiLen); //深度代码 t1[0]=m_explain_block.Depth_Code; phiLen += FillLisDataItemT(15,1,66,t1,phiLen); } //数据说明块子类型 t1[0]=m_explain_block.Curve_Mode; phiLen += FillLisDataItemT(16,1,66,t1,phiLen); //项块结束标志 t1[0]=0; m_explain_block.End_Flag= (phiLen+sizeof(struct DataItem))%2; phiLen += FillLisDataItemT(0,m_explain_block.End_Flag,66,t1,phiLen); /////////////////////////////////////////////////////////////////////// // 数据说明块 struct CurveS1 curve1; struct CurveS0 curve0; memset(&curve1,0x20,sizeof(struct CurveS1)); memset(&curve0,0x20,sizeof(struct CurveS0)); BYTE ProcID=2; if(LogDir<0) // Up logging ProcID += 128; else if( LogDir>0 ) // down logging ProcID += 64; else // time logging ProcID += 16; // data channel not on depth //////////////////////////////// DEPT////////////////////// if(m_explain_block.Depth_Mode==0) { if(m_explain_block.Curve_Mode==1) { memset(&curve1,0x20,sizeof(struct CurveS1)); strncpy(curve1.Name,"DEPT",4); strncpy(curve1.ServeID ,"MYYLIS",6); strncpy(curve1.Unit,"M ",4); memset(&curve1.APICode,0,4); curve1.DotsNum = 1; ConvertFloatToLisData(float( 1 *sizeof(float)),curve1.Length,79); curve1.DataType = 68; //PC机的IEEE格式 表示码为? ConvertFloatToLisData((float)1.0,curve1.FileNo,79); memset(&curve1.ProcID,0,5); curve1.ProcID[0]=ProcID; memcpy(tmpb+phiLen,&curve1,sizeof(struct CurveS1)); phiLen+=sizeof(struct CurveS1); } else { memset(&curve0,0x20,sizeof(struct CurveS0)); strncpy(curve0.Name,"DEPT",4); strncpy(curve0.ServeID ,"MYYLIS",6); strncpy(curve0.Unit,"M ",4); memset(&curve0.APICode,0,4); curve0.DotsNum = 1; ConvertFloatToLisData(float( 1 *sizeof(float)),curve0.Length,79); curve0.DataType = 68; //PC机的IEEE格式 表示码为? ConvertFloatToLisData((float)1.0,curve0.FileNo,79); memset(&curve0.ProcID,0,1); curve0.ProcID=ProcID; memcpy(tmpb+phiLen,&curve0,sizeof(struct CurveS0)); phiLen+=sizeof(struct CurveS0); } } /////////////////////////////////////////// for(i=0;i Max_Phi_Len) { tmpb[0] = Max_Phi_Len/0x100; tmpb[1] = Max_Phi_Len%0x100; tmpb[2] = 0x80; tmpb[3] = 0x01; DataFile->write((char*)&tmpb[0],Max_Phi_Len); int lastLen; lastLen= phiLen - Max_Phi_Len + 4 ; tmpb[Max_Phi_Len-4] = lastLen /0x100; tmpb[Max_Phi_Len-3] = lastLen %0x100; tmpb[Max_Phi_Len-2] = 0x80; tmpb[Max_Phi_Len-1] = 0x02; DataFile->write((char*)&tmpb[0] + Max_Phi_Len -4,lastLen); } else { tmpb[0] = phiLen/0x100; tmpb[1] = phiLen%0x100; tmpb[2] = 0x80; tmpb[3] = 0; DataFile->write((char*)&tmpb[0],phiLen); } return phiLen; }; BYTE t1[100]; void Data_Write(BYTE *ProjBuf) { if(m_explain_block.Depth_Mode==0)//每帧数据都有一个深度 { ConvertFloatToLisData((float)(curIndex+ii*realFrame_Step) ,t1,m_explain_block.Depth_Code); memcpy(&tmp[b_ptr],t1,4); b_ptr+=4; } for(int i=0;i0) tmpb[3] = 3; else tmpb[3] = 2; } else { memcpy(tmpb+phiLen,tmp+(ProcessBlock+(1-m_explain_block.Depth_Mode)*sizeof(float))*curRecordCount-b_ptr,b_ptr); phiLen+= b_ptr; b_ptr=0; if(PhiN==0) tmpb[3]=0; else tmpb[3] = 2; } tmpb[0] =(BYTE)(phiLen / 0x100); tmpb[1] =(BYTE)(phiLen % 0x100); DataFile->write((char*)&tmpb[0], phiLen); PhiN++; }while(b_ptr>0); } }; void End_Flush() { int curRecordCount=projRecordCount; if(ii%projRecordCount>0 ) { curRecordCount=ii%projRecordCount; //剩余块 b_ptr=(ProcessBlock+(1-m_explain_block.Depth_Mode)*sizeof(float))*curRecordCount; int PhiN=0,LogHead; do { //物理记录头4bytes,逻辑记录类型2bytes,深度初始值 tmpb[2]=0x80; tmpb[3]=0x00; unsigned short phiLen; phiLen = 4; if(PhiN==0) { tmpb[4] = 0; //逻辑记录头 数据记录 tmpb[5] = 0; phiLen += 2; if(m_explain_block.Depth_Mode==1)//一个物理块只包含一个深度值 { ConvertFloatToLisData((float)(curIndex+(ii-curRecordCount+1)*realFrame_Step) ,t1,m_explain_block.Depth_Code); memcpy(tmpb+phiLen,t1,4); phiLen += 4; } } else {//只有物理信息,没有逻辑信息 } LogHead=phiLen; if(Max_Phi_Len-LogHead0) tmpb[3] = 3; else tmpb[3] = 2; } else { memcpy(tmpb+phiLen,tmp+(ProcessBlock+(1-m_explain_block.Depth_Mode)*sizeof(float))*curRecordCount-b_ptr,b_ptr); phiLen+= b_ptr; b_ptr=0; if(PhiN==0) tmpb[3]=0; else tmpb[3] = 2; } tmpb[0] =(BYTE)(phiLen / 0x100); tmpb[1] =(BYTE)(phiLen % 0x100); DataFile->write((char*)&tmpb[0], phiLen); PhiN++; }while(b_ptr>0); } }; void Begin_Write(float StartIndex) { curIndex=StartIndex; ii=0; realFrame_Step = m_explain_block.Frame_Step; if(LogDir<0) //up logging realFrame_Step *= (-1); if(m_explain_block.Depth_Mode) //一个数据物理块只有一个深度 projRecordCount= (Max_Phi_Len-6-sizeof(float) )/ProcessBlock; else //每帧数据都有一个深度 projRecordCount= (Max_Phi_Len-6)/ (ProcessBlock+sizeof(float)); if(projRecordCount>255) projRecordCount=255; if(projRecordCount==0) projRecordCount=1; int recl=0; for(int i=0;i>8; tmpb[1]=dd&0x0ff; break; case 73:// 32位补码整数 dd= (int)(srcData); if(srcData<0) { dd=( (~dd)+1)&0xffffffff; dd=dd|0x80000000; } tmpb[0]=dd>>24; tmpb[1]=dd>>16; tmpb[2]=dd>>8; tmpb[3]=dd&0x0ff; break; case 70: // 32位定点数 //整数部分 dd=(int)(fabs(srcData)*10); dd=dd/10; IntData=dd; if(srcData<0) { dd=( (~dd)+1)&0xffff; dd=dd|0x8000; } tmpb[0]=dd>>8; tmpb[1]=dd&0x0ff; //小数部分 TailData = fabs(srcData) -IntData; for(i=0;i<2;i++) { tmpb[2+i]=0; for(j=0;j<8;j++) { TailData *=2.0; if(TailData>=1) tmpb[2+i]+=(int)pow(2.,8-j); } } break; case 49: // 16位 低分辨率 浮点数 break; case 50: // 'F' 32位低分辨率浮点数 break; case 68: // 'D' 32位高分辨率浮点数 { int ExData,TailData; float *tmpf; BYTE tmpt[4]; tmpf=(float *)tmpt; *tmpf=srcData; //填充阶码 ExData = (tmpt[3]&0x7f )<<1; ExData = ExData+(tmpt[2]>>7); ExData = ExData-127; ExData = ExData+1; if(srcData>0) { ExData=128 + ExData; tmpb[0] = ExData>>1 ; tmpb[1] =(ExData &0x01) *0x80; } else { ExData=127 - ExData; tmpb[0] =( ExData>>1) +0x80; tmpb[1] =(ExData &0x01) *0x80; } //填充尾数 TailData = (tmpt[2]&0x7f) *0x10000 + tmpt[1]*0x100+ tmpt[0]; TailData =TailData &0x7fffff; double aa; aa=0; for(i=0;i<23;i++) { if(TailData &0x01) aa+=pow(2.,i-23); TailData=TailData>>1; } aa=aa+1; aa=aa/2.0; int ww; ww=0; for(i=0;i<23;i++) { aa =aa*2; if(aa>=1.0) { ww+=(int)pow(2.,22-i); aa=aa-1.0; } } if(srcData<0) { ww= (~ww)+1; } ww =ww&0x7fffff; int aq; aq=ww>>16; aq=aq&0x7f; tmpb[1]+=aq; aq=ww>>8; aq=aq&0xff; tmpb[2]=aq; aq=ww&0xff; tmpb[3]=aq; } break; } }; float ConvertLisDataToFloat(BYTE dataCode, BYTE srcData[]) { int i,sign,dd; double rData,ExData,TailData; rData=0; if(srcData[0]&0x80) sign=-1; else sign=1; switch(dataCode) { case 56: // //8 位有符号整数 rData=srcData[0]; if(sign<0) rData = rData -pow(2.,8); break; case 65: //'C' case 66: // 'B' //8 位无符号整数 rData=srcData[0]; break; case 73: // 'I' //32位整数 { dd = ((srcData[0] &0x7f)*0x100 +srcData[1]) *0x10000 +srcData[2]*0x100 +srcData[3]; if(sign<0) { dd=~(dd-1); } rData =sign *dd; } break; case 79: // 'N' //16位整数 { dd = (srcData[0] &0x7f)*0x100 +srcData[1]; if(sign<0) { dd=~(dd-1); } rData =sign *dd; } break; case 49: // 16位浮点数 { //填充阶码 ExData= srcData[1] &0x0f; //填充尾数 dd=(srcData[0] &0x7f )*0x10 +(srcData[1]>>4); if(sign<0) { dd=~(dd-1); } TailData=0; for(i=0;i<11;i++) { if(dd &0x01) { TailData+=pow(2.,i-11); } dd=dd>>1; } TailData =sign *TailData; rData = TailData *pow(2,ExData); } break; case 50: // 'F' 32位低分辨率浮点数 { //填充阶码 dd= srcData[0]*0x100 + srcData[1]; if(sign<0) { dd=~(dd-1); } dd=dd&0x7f; ExData=0; for(i=0;i<15;i++) { if(dd&0x01) ExData+=pow(2.,i+1); dd=dd>>1; } ExData= sign *ExData; //填充尾数 if(srcData[2]&0x80) sign=-1; else sign=1; dd= srcData[2]*0x100 + srcData[3]; if(sign<0) { dd=~(dd-1); } dd=dd&0x7f; TailData=0; for(i=0;i<15;i++) { if(dd &0x01) TailData+=pow(2.,i-15); dd=dd>>1; } TailData = sign *TailData; rData=TailData *pow(2.,ExData); } break; case 68: // 'D' //32浮点数 { //填充浮点数的阶码 dd=(srcData[0]&0x7f)*2 +(srcData[1]>>7); ExData=dd &0x0ff; // 填充浮点数的尾数 dd= ((srcData[1]&0x7f)*0x100 + srcData[2])*0x100+ srcData[3]; if(sign<0) { dd=~(dd-1); } TailData=0; for(i=0;i<23;i++) { if(dd&0x01) TailData+=pow(2.,i-23); dd=dd>>1; } TailData = sign *TailData; if(sign>0) rData= TailData *pow(2.,ExData-128); else rData= TailData *pow(2.,127-ExData); } break; case 70: // 32位定点数 { //填充阶码 dd= (srcData[0] &0x7f)*0x100+ srcData[1]; if(sign<0) { dd=~(dd-1); } dd=dd&0x7fff; ExData=dd*sign; //填充尾数 dd=srcData[2]*0x100+srcData[3]; TailData=0; for(i=0;i<16;i++) { if(dd&0x01) TailData+=pow(2.,i-16); dd=dd>>1; } TailData =sign *TailData; rData=ExData+TailData; } break; }//switch return (float)rData; }; };