⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datastring.cpp

📁 ASCII数据块显示
💻 CPP
字号:
// DataString.cpp: implementation of the CDataString class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GSV.h"
#include "DataString.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define INDEXOFFIELD(i) dataindex[i],dataindex[i+1]-dataindex[i]-1

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDataString::CDataString()
{

}

CDataString::CDataString(CByteArray *pBinData)
{
	CString flagstr;
	CString str;

	for(int i=0;i<pBinData->GetSize();i++)
	{
		
		str=str+(char)pBinData->GetAt(i);  //注意!!!!!!!!
	}

	if(str.IsEmpty()!=0)
		return;

	if(str[0]=='#')
	{
		int headlength=str.Find(';');
		if(headlength==-1){
			m_string=str;
			return;
		}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

		m_headOfstring=str.Left(headlength);             //提取出ASCII数据的信息头(m_headOfstring)
		m_string=str.Right(str.GetLength()-headlength-1);//提取出ASCII数据的数据块(m_string)

//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
		int flaglength=m_headOfstring.Find(',');        //信息头格式:#BESTPOSA,X,X,X,...,X;
		flagstr=m_headOfstring.Left(flaglength);        //取信息头第一个逗号分隔符左边的字符串


/* ASCII数据块标识(DataString.h)  !!注意和二进制数据块标识相区别!!!!!!
#define BESTPOSA 0
#define RANGEA 1
#define GPGSV 2
*/
//int flagDataType; (DataString.h)

		if(flagstr=="#BESTPOSA"){
			m_flagDataType = BESTPOSA;
		}else if(flagstr=="#RANGEA"){
			m_flagDataType = RANGEA;
		}
	}else if(str[0]=='$'){

		int flaglength=str.Find(',');
		flagstr=str.Left(flaglength);
		m_string=str;

		if(flagstr=="$GPGSV"){
			m_flagDataType = GPGSV;
		}
	}
}

CDataString::CDataString(CString str)
{
	CString flagstr;

	if(str.IsEmpty()!=0)
		return;

	if(str[0]=='#')
	{
		int headlength=str.Find(';');
		if(headlength==-1){
			m_string=str;
			return;
		}

		m_headOfstring=str.Left(headlength);
		m_string=str.Right(str.GetLength()-headlength-1);

		int flaglength=m_headOfstring.Find(',');
		flagstr=m_headOfstring.Left(flaglength);

		if(flagstr=="#BESTPOSA"){
			m_flagDataType = BESTPOSA;
		}else if(flagstr=="#RANGEA"){
			m_flagDataType = RANGEA;
		}
	}else if(str[0]=='$'){

		int flaglength=str.Find(',');
		flagstr=str.Left(flaglength);
		m_string=str;

		if(flagstr=="$GPGSV"){
			m_flagDataType = GPGSV;
		}
	}

}

CDataString::~CDataString()
{

}

CString CDataString::GetHeadString()
{
	return m_headOfstring;                 //返回信息头串
}

//"分离"保存ASCII头信息
BOOL CDataString::GetHeadData(HEAD_DATABLOCK *pHeaddata)
{
	if(m_headOfstring.IsEmpty()!=0)
		return FALSE;
	CArray<int,int> dataindex;
	GetHowManyFields(m_headOfstring,&dataindex);

	strcpy(pHeaddata->Message,m_headOfstring.Mid(INDEXOFFIELD(0)));
	strcpy(pHeaddata->Port,m_headOfstring.Mid(INDEXOFFIELD(1)));
	//将信息头部分字段保存在m_headOfstring中
	sscanf(m_headOfstring.Mid(INDEXOFFIELD(2)),     
		"%f",&pHeaddata->SequenceNum);            
	sscanf(m_headOfstring.Mid(INDEXOFFIELD(3)),
		"%f",&pHeaddata->IdleTime);
	strcpy(pHeaddata->GpsTimeStatus,m_headOfstring.Mid(INDEXOFFIELD(4)));
	sscanf(m_headOfstring.Mid(INDEXOFFIELD(5)),
		"%d",&pHeaddata->Week);
	sscanf(m_headOfstring.Mid(INDEXOFFIELD(6)),
		"%lf",&pHeaddata->Seconds);
	sscanf(m_headOfstring.Mid(INDEXOFFIELD(7)),
		"%f",&pHeaddata->ReceiverStatus);
	sscanf(m_headOfstring.Mid(INDEXOFFIELD(8)),
		"%f",&pHeaddata->Reserved);
	sscanf(m_headOfstring.Mid(dataindex[9],m_headOfstring.GetLength()-dataindex[9]),
		"%f",&pHeaddata->ReceiverSWversion);

	return TRUE;
}

//获取数据块的域
CString CDataString::GetDataAtFieldN(CString *str, int n)    
{
	CString reStr;

	return reStr;
}

//获取ASCII数据中域的数目
int CDataString::GetHowManyFields(CString str,CArray<int,int> *DataIndex)  
{
//	CArray<int,int> DataIndex;

	if(str.IsEmpty()!=0)
		return 0;

//	str.TrimLeft(',');
//	str.TrimRight(',');

	int fieldlength_s=0;
	int	fieldlength_e=0;

	DataIndex->Add(0);
	
	for(;;)
	{		
		fieldlength_e=str.Find(',',fieldlength_s);

		if(fieldlength_e==-1){
			int whs=str.Find('*');
			if(whs==-1){
				return DataIndex->GetSize();   //已到锁定的最后一颗卫星,返回域数目   ???
                                               //锁定的卫星数=[(DataIndex->GetSize())-5]/4  ??


			}else
			{
				DataIndex->Add(whs+1);
				return DataIndex->GetSize();
			}
		}
		fieldlength_s=fieldlength_e+1;
		DataIndex->Add(fieldlength_s);


	}
}
/*
BOOL CDataString::GetBestPos(VARIABLE_POS *pBestpos)
{
	if(m_string.IsEmpty()!=0)
		return FALSE;
	CArray<int,int> dataindex;

	GetHowManyFields(m_string,&dataindex);

	sscanf(m_string.Mid(INDEXOFFIELD(2)),
		"%lf",&pBestpos->lat);
	sscanf(m_string.Mid(INDEXOFFIELD(3)),
		"%lf",&pBestpos->lon);
	sscanf(m_string.Mid(INDEXOFFIELD(4)),
		"%lf",&pBestpos->hgt);

	return TRUE;

}*/
/*
BOOL CDataString::GetRange(CArray<VARIABLE_RANGE, VARIABLE_RANGE> *pArange)
{
	if(m_string.IsEmpty()!=0)
		return FALSE;

	HEAD_DATABLOCK head;
	
	GetHeadData(&head);


	CArray<int,int> dataindex;

	GetHowManyFields(m_string,&dataindex);

	int nObs;
	sscanf(m_string.Mid(INDEXOFFIELD(0)),
		"%ld",&nObs);
	if(nObs==0){return FALSE;}
	int index=0;
	for(int i=0;i<nObs;i++)
	{	
//		VARIABLE_RANGE *prange=new VARIABLE_RANGE;
		VARIABLE_RANGE range;
		range.week=head.Week;
		range.second=head.Seconds;
		sscanf(m_string.Mid(INDEXOFFIELD(index+1)),
			"%hd",&range.PRN);
		sscanf(m_string.Mid(INDEXOFFIELD(index+2)),
			"%hd",&range.Reserved);
		sscanf(m_string.Mid(INDEXOFFIELD(index+3)),
			"%lf",&range.psr);
		sscanf(m_string.Mid(INDEXOFFIELD(index+4)),
			"%f",&range.psr_std);
		sscanf(m_string.Mid(INDEXOFFIELD(index+5)),
			"%lf",&range.adr);
		sscanf(m_string.Mid(INDEXOFFIELD(index+6)),
			"%f",&range.adr_std);
		sscanf(m_string.Mid(INDEXOFFIELD(index+7)),
			"%f",&range.Dopp);
		sscanf(m_string.Mid(INDEXOFFIELD(index+8)),
			"%f",&range.CN0);
		sscanf(m_string.Mid(INDEXOFFIELD(index+9)),
			"%f",&range.locktime);
		sscanf(m_string.Mid(INDEXOFFIELD(index+10)),
			"%x",&range.ch_tr_status);
		pArange->SetAtGrow(i,range);
		index=index+10;

	}

	return TRUE;
}*/

//获取ASCII数据中GPGSV数据块
BOOL CDataString::GetGpgsv(CArray<VARIABLE_GPGSV, VARIABLE_GPGSV> *pAGpgsv)
{
	if(m_string.IsEmpty()!=0)
		return FALSE;

	CArray<int,int> dataindex;

	GetHowManyFields(m_string,&dataindex);

	int nObs = dataindex.GetSize();

	if(nObs<5){return FALSE;}
	
	int nGps=(nObs-5)/4;            //可见卫星数
	int index=4;

	for(int i=0;i<nGps;i++)
	{	
		VARIABLE_GPGSV gpsi;
	//将ASCII数据中数据块各字段保存在m_string中
		sscanf(m_string.Mid(INDEXOFFIELD(index)),
			"%hd",&gpsi.PRN);
		sscanf(m_string.Mid(INDEXOFFIELD(index+1)),
			"%hd",&gpsi.elev);
		sscanf(m_string.Mid(INDEXOFFIELD(index+2)),
			"%hd",&gpsi.azimuth);
		CString ss=m_string.Mid(INDEXOFFIELD(index+3));
		if(ss.IsEmpty())
		{	gpsi.SNR=100;
		}else{
			sscanf(ss,"%hd",&gpsi.SNR);
		}
		//CArray::SetAtGrow 向CArray类型数组中放数据
		//CArray<VARIABLE_GPGSV, VARIABLE_GPGSV> *pAGpgsv
		pAGpgsv->SetAtGrow(i,gpsi);
		index=index+4;

////////////////////////////////////////////////////////////////     
	 //在GSVVIEW.cpp中调用该数组:
	 //	    CArray<VARIABLE_GPGSV, VARIABLE_GPGSV> AGpgsv;
	 //		ds.GetGpgsv(&AGpgsv);
	 //		pDoc->m_prnR.SetGpsInf(&AGpgsv);               

	}

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -