TLV编解码【编程】


感觉做的方法不好,仅用于备份,仅供参考!

不多说了,直接上代码!


#include <iostream>
using namespace std;
#define M 10
int dataLength = 0;

struct NODE{
	char strTag[100];	
	char strLen[100];
	char strVale[100];
	bool isNoLen;
	int value;
}nodeData[M];

int GetNumLength(char *ppstr)
{
	char*pstr = strdup(ppstr);
	if(pstr==NULL)
		return 0;
	int num1 = 0;
	int num2 = 0;
	char *pSaveStr = strtok(pstr,",");
	while(pSaveStr!=NULL)
	{		
		sscanf(pSaveStr,"%x",&num2);
		num1 *= (16*16);	
		num1 += num2;		
		pSaveStr = strtok(NULL,",");
	}
	delete pstr;
	return num1;
}
bool GetMsg(char *pstr)
{
	while(pstr!=NULL)
	{	
		char *pSavest1 = pstr+30;
		if(*pSavest1 == '\0')
			return false;
		strncpy(nodeData[dataLength].strTag, pstr, 19);
		strncpy(nodeData[dataLength].strLen, pstr+20, 9);
		int nunLength = GetNumLength(nodeData[dataLength].strLen);
		if(nunLength!=0)
			nodeData[dataLength].isNoLen = false;
		else 
			nodeData[dataLength].isNoLen = true;
		strncpy(nodeData[dataLength].strVale, pstr+30, nunLength*5);
		nodeData[dataLength].value = GetNumLength(nodeData[dataLength].strVale);
		pstr=pSavest1+nunLength*5;	
		dataLength++;
		if(*pstr=='\0')
			return true;	
	}
	return true;
}
void PaiXu()
{
	for (int i=0; i<dataLength; i++)
	{
		for (int j=i+1; j<dataLength; j++)
		{
			if(nodeData[i].value<nodeData[j].value)	//sawp
			{
				struct NODE dateTemp;
				memcpy(&dateTemp, &nodeData[i], sizeof(struct NODE));
				memcpy(&nodeData[i], &nodeData[j], sizeof(struct NODE));
				memcpy(&nodeData[j], &dateTemp, sizeof(struct NODE));
			}
		}
	}

}

void main()
{	
	char strInput[1000] = {'\0'};
	memset(nodeData, '\0', M*sizeof(struct NODE));
	cin>>strInput;
	if(!GetMsg(strInput))
	{
		cout<<"false"<<endl;
		return;
	}
	PaiXu();
	for (int i=0; i<dataLength; i++)
	{
		cout<<nodeData[i].strTag<<","<<nodeData[i].strLen;
		
		if(i!=dataLength-1) //no end
			if(nodeData[i].isNoLen)	//no length
				cout<<",";
			else
				cout<<","<<nodeData[i].strVale<<",";
		else
			if(!nodeData[i].isNoLen)
			cout<<","<<nodeData[i].strVale;
	}
	cout<<endl;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值