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

📄 tlv.cpp

📁 TLV算法实现数据压缩解压源码(内附测试)
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include <conio.h>

typedef struct userInfo
{
	char user_type;   

	char user_real_name[20];   
	char user_sex;
	char user_psword[10];   
	char user_psquestion[48];
	char user_psanswer[48];
	char user_company[48];
	char user_occupation[32]; 

	char user_birthday[10];   
	char user_nation[10];
	char user_eduction[10];
	char user_school[32];
	char user_native[24];
	char user_telephone[13];  
	char user_mobile[13];     
	char user_address[48]; 	
	char user_postalcode[7] ;   
	char user_bloodtype;  
	char user_constellation;
	char user_homepage[64];
	char user_instuction[128];
	char user_sign[64];
}userInfo_t;

void compress(userInfo_t user_SEND,char* BuffPointer);
void decompress(char* BuffPointer,userInfo_t user_REC);

userInfo_t user_SEND,user_REC;
userInfo_t *user_RECPpointer=&user_REC;
userInfo_t *user_SendPointer=&user_SEND;

char Buff[2048];
char *BuffPointer=Buff;

int main()
{

/*	user_SEND.user_type='1';
	strcpy(user_SEND.user_real_name,"Chenlansheng");
	user_SEND.user_sex='1';
	strcpy(user_SEND.user_psword,"820803");
	strcpy(user_SEND.user_psquestion,"my mum's birthday?");
	strcpy(user_SEND.user_psanswer,"19560515");
	strcpy(user_SEND.user_company,"Changzhou ZhongHai");
	strcpy(user_SEND.user_occupation,"Manager");
	strcpy(user_SEND.user_birthday,"19820803");
	strcpy(user_SEND.user_nation,"China");
	strcpy(user_SEND.user_eduction,"Hight school");
	strcpy(user_SEND.user_school,"2MiddleSchool");
	strcpy(user_SEND.user_native,"JiangSU");
 	strcpy(user_SEND.user_telephone,"0");
	strcpy(user_SEND.user_mobile,"1391932110");
	strcpy(user_SEND.user_address,"QingGuoXiang");
	strcpy(user_SEND.user_postalcode,"213002");
	user_SEND.user_bloodtype='O';
	user_SEND.user_constellation='A';
	strcpy(user_SEND.user_homepage,"www.baidu.com");
	strcpy(user_SEND.user_instuction,"Nothing");
	strcpy(user_SEND.user_sign,"Do MySelf");

*/ //测试用,
	compress(user_SEND,BuffPointer);
/*	for(int num=0;num<300;num++)
		printf("Buff[%d]=%c\n",num,Buff[num]);
*/  //测试用,	
	decompress(BuffPointer,user_REC);

	getch();
    return 0;
}

void compress(userInfo_t user_SEND,char* BuffPointer)
{
    int BuffSendNum=0;         //Buff包字节序号
	unsigned int ByteSendNum;   //各字段发送时的字节数


    for(int n=0;n<22;n++)
    {
		switch(n)
		{
		case 0:	if(user_SendPointer->user_type!=0)
				{	
					ByteSendNum=1;
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_type,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 1:	if(user_SendPointer->user_real_name!=0)
				{
					ByteSendNum=strlen(user_SendPointer->user_real_name);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_real_name,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 2:	if(user_SendPointer->user_sex!=0)
				{	
					ByteSendNum=1;
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_sex,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 3:	if(user_SendPointer->user_psword!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_psword);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_psword,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 4:	if(user_SendPointer->user_psquestion!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_psquestion);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_psquestion,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 5:	if(user_SendPointer->user_psanswer!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_psanswer);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_psanswer,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 6:	if(user_SendPointer->user_company!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_company);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_company,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 7:	if(user_SendPointer->user_occupation!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_occupation);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_occupation,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 8:	if(user_SendPointer->user_birthday!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_birthday);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_birthday,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 9:if(user_SendPointer->user_nation!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_nation);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_nation,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 10:if(user_SendPointer->user_eduction!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_eduction);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_eduction,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 11:if(user_SendPointer->user_school!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_school);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_school,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;	
		case 12:if(user_SendPointer->user_native!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_native);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_native,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;		
		case 13:if(user_SendPointer->user_telephone!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_telephone);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_telephone,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;		
		case 14:if(user_SendPointer->user_mobile!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_mobile);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_mobile,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;		
		case 15:if(user_SendPointer->user_address!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_address);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_address,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;		
		case 16:if(user_SendPointer->user_postalcode!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_postalcode);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_postalcode,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;		
		case 17:if(user_SendPointer->user_bloodtype!=0)
				{	
					ByteSendNum=1;
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_bloodtype,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;		
		case 18:if(user_SendPointer->user_constellation!=0)
				{	
					ByteSendNum=1;
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_constellation,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 19:if(user_SendPointer->user_homepage!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_homepage);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_homepage,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 20:if(user_SendPointer->user_instuction!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_instuction);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_instuction,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		case 21:if(user_SendPointer->user_sign!=0)
				{	
					ByteSendNum=strlen(user_SendPointer->user_sign);
					Buff[BuffSendNum]=n;
					Buff[++BuffSendNum]=ByteSendNum;
					memcpy(&Buff[++BuffSendNum],&user_SendPointer->user_sign,ByteSendNum);
					BuffSendNum+=ByteSendNum;
				}
				break;
		}


    }
}

void decompress(char* BuffPointer,userInfo_t user_REC)
{
    unsigned int BuffRecNum=0;     //Buff包接收字节序列标记
    int BuffCount=0;      //Buff包内存拷贝字节数
    unsigned int BuffRecFlag=0;    //Buff包各单元记数记号

    for(int n=0;n<22;n++)
    {
        BuffRecFlag=BuffPointer[BuffRecNum++];
        BuffCount=int(BuffPointer[BuffRecNum++]);
		printf("BuffRecFlag=%c\n",BuffRecFlag+48);
		printf("BuffCount=%d\n",BuffCount);
		
        switch(BuffRecFlag+48)
        {
		case '0': memcpy(&(user_RECPpointer->user_type),&BuffPointer[BuffRecNum],BuffCount);
                break;
        case '1': memcpy(&(user_RECPpointer->user_real_name),&BuffPointer[BuffRecNum],BuffCount);
                break;
        case '2': memcpy(&(user_RECPpointer->user_sex),&BuffPointer[BuffRecNum],BuffCount);
                break;
		case '3': memcpy(&(user_RECPpointer->user_psword),&BuffPointer[BuffRecNum],BuffCount);
				break;
		case '4': memcpy(&(user_RECPpointer->user_psquestion),&BuffPointer[BuffRecNum],BuffCount);
				break;
        case '5': memcpy(&(user_RECPpointer->user_psanswer),&BuffPointer[BuffRecNum],BuffCount);
                break;
        case '6': memcpy(&(user_RECPpointer->user_company),&BuffPointer[BuffRecNum],BuffCount);
                break;
		case '7': memcpy(&(user_RECPpointer->user_occupation),&BuffPointer[BuffRecNum],BuffCount);
				break;
		case '8': memcpy(&(user_RECPpointer->user_birthday),&BuffPointer[BuffRecNum],BuffCount);
				break;
        case '9': memcpy(&(user_RECPpointer->user_nation),&BuffPointer[BuffRecNum],BuffCount);
                break;
        case '10': memcpy(&(user_RECPpointer->user_eduction),&BuffPointer[BuffRecNum],BuffCount);
                break;
		case '11': memcpy(&(user_RECPpointer->user_school),&BuffPointer[BuffRecNum],BuffCount);
				break;
		case '12': memcpy(&(user_RECPpointer->user_native),&BuffPointer[BuffRecNum],BuffCount);
				break;
        case '13': memcpy(&(user_RECPpointer->user_mobile),&BuffPointer[BuffRecNum],BuffCount);
                break;
        case '14': memcpy(&(user_RECPpointer->user_address),&BuffPointer[BuffRecNum],BuffCount);
                break;
		case '15': memcpy(&(user_RECPpointer->user_postalcode),&BuffPointer[BuffRecNum],BuffCount);
				break;
		case '16': memcpy(&(user_RECPpointer->user_bloodtype),&BuffPointer[BuffRecNum],BuffCount);
				break;
        case '17': memcpy(&(user_RECPpointer->user_type),&BuffPointer[BuffRecNum],BuffCount);
                break;
        case '18': memcpy(&(user_RECPpointer->user_constellation),&BuffPointer[BuffRecNum],BuffCount);
                break;
		case '19': memcpy(&(user_RECPpointer->user_homepage),&BuffPointer[BuffRecNum],BuffCount);
				break;
		case '20': memcpy(&(user_RECPpointer->user_instuction),&BuffPointer[BuffRecNum],BuffCount);
				break;
        case '21': memcpy(&(user_RECPpointer->user_sign),&BuffPointer[BuffRecNum],BuffCount);
        }

        BuffRecNum+=BuffCount;
    }
}

⌨️ 快捷键说明

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